gh-127740: For odd-length input to bytes.fromhex(...) change the error message to ValueError: fromhex() arg must be of even length (#127756)
This commit is contained in:
parent
12b4f1a5a1
commit
db9bea0386
@ -459,6 +459,12 @@ class BaseBytesTest:
|
|||||||
self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
|
self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
|
||||||
self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
|
self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
|
||||||
|
|
||||||
|
# For odd number of character(s)
|
||||||
|
for value in ("a", "aaa", "deadbee"):
|
||||||
|
with self.assertRaises(ValueError) as cm:
|
||||||
|
self.type2test.fromhex(value)
|
||||||
|
self.assertIn("fromhex() arg must contain an even number of hexadecimal digits", str(cm.exception))
|
||||||
|
|
||||||
for data, pos in (
|
for data, pos in (
|
||||||
# invalid first hexadecimal character
|
# invalid first hexadecimal character
|
||||||
('12 x4 56', 3),
|
('12 x4 56', 3),
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
Fix error message in :func:`bytes.fromhex` when given an odd number of
|
||||||
|
digits to properly indicate that an even number of hexadecimal digits is
|
||||||
|
required.
|
@ -2543,7 +2543,12 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray)
|
|||||||
|
|
||||||
bot = _PyLong_DigitValue[*str];
|
bot = _PyLong_DigitValue[*str];
|
||||||
if (bot >= 16) {
|
if (bot >= 16) {
|
||||||
invalid_char = str - PyUnicode_1BYTE_DATA(string);
|
/* Check if we had a second digit */
|
||||||
|
if (str >= end){
|
||||||
|
invalid_char = -1;
|
||||||
|
} else {
|
||||||
|
invalid_char = str - PyUnicode_1BYTE_DATA(string);
|
||||||
|
}
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
str++;
|
str++;
|
||||||
@ -2554,9 +2559,14 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray)
|
|||||||
return _PyBytesWriter_Finish(&writer, buf);
|
return _PyBytesWriter_Finish(&writer, buf);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
PyErr_Format(PyExc_ValueError,
|
if (invalid_char == -1) {
|
||||||
"non-hexadecimal number found in "
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"fromhex() arg at position %zd", invalid_char);
|
"fromhex() arg must contain an even number of hexadecimal digits");
|
||||||
|
} else {
|
||||||
|
PyErr_Format(PyExc_ValueError,
|
||||||
|
"non-hexadecimal number found in "
|
||||||
|
"fromhex() arg at position %zd", invalid_char);
|
||||||
|
}
|
||||||
_PyBytesWriter_Dealloc(&writer);
|
_PyBytesWriter_Dealloc(&writer);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user