https://github.com/python/cpython/commit/c2cb1a89b75f000842bf9626928155172b9ab069 commit: c2cb1a89b75f000842bf9626928155172b9ab069 branch: 3.13 author: Sergey B Kirpichev <[email protected]> committer: vstinner <[email protected]> date: 2024-10-10T14:58:57Z summary:
[3.13] gh-125118: don't copy arbitrary values to _Bool in the struct module (GH-125169) (#125263) memcopy'ing arbitrary values to _Bool variable triggers undefined behaviour. Avoid this. We assume that `false` is represented by all zero bytes. Credits to Alex Gaynor. (cherry picked from commit 87d7315ac57250046372b0d9ae4619ba619c8c87) Co-authored-by: Sam Gross <[email protected]> Co-authored-by: Victor Stinner <[email protected]> Co-authored-by: Petr Viktorin <[email protected]> files: A Misc/NEWS.d/next/Library/2024-10-09-07-09-00.gh-issue-125118.J9rQ1S.rst M Lib/test/test_struct.py M Modules/_struct.c diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index bdbf8800cfd8f6..e3ddaa090316ff 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -529,6 +529,9 @@ def __bool__(self): for c in [b'\x01', b'\x7f', b'\xff', b'\x0f', b'\xf0']: self.assertTrue(struct.unpack('>?', c)[0]) + self.assertTrue(struct.unpack('<?', c)[0]) + self.assertTrue(struct.unpack('=?', c)[0]) + self.assertTrue(struct.unpack('@?', c)[0]) def test_count_overflow(self): hugecount = '{}b'.format(sys.maxsize+1) diff --git a/Misc/NEWS.d/next/Library/2024-10-09-07-09-00.gh-issue-125118.J9rQ1S.rst b/Misc/NEWS.d/next/Library/2024-10-09-07-09-00.gh-issue-125118.J9rQ1S.rst new file mode 100644 index 00000000000000..5d57cdbbbc2fe9 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-10-09-07-09-00.gh-issue-125118.J9rQ1S.rst @@ -0,0 +1 @@ +Don't copy arbitrary values to :c:expr:`_Bool` in the :mod:`struct` module. diff --git a/Modules/_struct.c b/Modules/_struct.c index e76ed111a5ca81..30b8bd9600b378 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -486,9 +486,8 @@ nu_ulonglong(_structmodulestate *state, const char *p, const formatdef *f) static PyObject * nu_bool(_structmodulestate *state, const char *p, const formatdef *f) { - _Bool x; - memcpy((char *)&x, p, sizeof x); - return PyBool_FromLong(x != 0); + const _Bool bool_false = 0; + return PyBool_FromLong(memcmp(p, &bool_false, sizeof(_Bool))); } _______________________________________________ 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]
