https://github.com/python/cpython/commit/db9bea0386c1c0b6c9d7c66474cda7e47e4b56f5
commit: db9bea0386c1c0b6c9d7c66474cda7e47e4b56f5
branch: main
author: Srinivas Reddy Thatiparthy (తాటిపర్తి శ్రీనివాస్ రెడ్డి)
<[email protected]>
committer: cfbolz <[email protected]>
date: 2024-12-11T08:35:17+01:00
summary:
gh-127740: For odd-length input to bytes.fromhex(...) change the error message
to ValueError: fromhex() arg must be of even length (#127756)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2024-12-10-21-08-05.gh-issue-127740.0tWC9h.rst
M Lib/test/test_bytes.py
M Objects/bytesobject.c
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py
index 9e1985bb3a7639..32cd178fa3b445 100644
--- a/Lib/test/test_bytes.py
+++ b/Lib/test/test_bytes.py
@@ -459,6 +459,12 @@ def test_fromhex(self):
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 00000000000000..f614dbb59bdc87
--- /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 8c7651f0f3aa45..533089d25cd73a 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;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]