summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_bytes.py6
-rw-r--r--Misc/NEWS.d/next/Core_and_Builtins/2024-12-10-21-08-05.gh-issue-127740.0tWC9h.rst3
-rw-r--r--Objects/bytesobject.c18
3 files changed, 23 insertions, 4 deletions
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index 9e1985b..32cd178 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -459,6 +459,12 @@ class BaseBytesTest:
self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
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 (
# invalid first hexadecimal character
('12 x4 56', 3),
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-12-10-21-08-05.gh-issue-127740.0tWC9h.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-10-21-08-05.gh-issue-127740.0tWC9h.rst
new file mode 100644
index 0000000..f614dbb
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2024-12-10-21-08-05.gh-issue-127740.0tWC9h.rst
@@ -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.
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 8c7651f..533089d 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2543,7 +2543,12 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray)
bot = _PyLong_DigitValue[*str];
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;
}
str++;
@@ -2554,9 +2559,14 @@ _PyBytes_FromHex(PyObject *string, int use_bytearray)
return _PyBytesWriter_Finish(&writer, buf);
error:
- PyErr_Format(PyExc_ValueError,
- "non-hexadecimal number found in "
- "fromhex() arg at position %zd", invalid_char);
+ if (invalid_char == -1) {
+ PyErr_SetString(PyExc_ValueError,
+ "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);
return NULL;
}