diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py index a631a6abbe0..cd76dbbc637 100755 --- a/Lib/test/test_binascii.py +++ b/Lib/test/test_binascii.py @@ -108,6 +108,9 @@ class BinASCIITest(unittest.TestCase): self.assertRaises(binascii.Error, binascii.b2a_uu, 46*b"!") + # Issue #7701 (crash on a pydebug build) + self.assertEqual(binascii.b2a_uu(b'x'), b'!> \n') + def test_crc32(self): crc = binascii.crc32(b"Test the CRC-32 of") crc = binascii.crc32(b" this string.", crc) diff --git a/Misc/NEWS b/Misc/NEWS index f2e2fed6ca6..b2203064d6e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -213,6 +213,9 @@ C-API Library ------- +- Issue #7701: Fix crash in binascii.b2a_uu() in debug mode when given a + 1-byte argument. Patch by Victor Stinner. + - Issue #3299: Fix possible crash in the _sre module when given bad argument values in debug mode. Patch by Victor Stinner. diff --git a/Modules/binascii.c b/Modules/binascii.c index 51101b412a5..833283f7c98 100644 --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -294,7 +294,7 @@ binascii_b2a_uu(PyObject *self, PyObject *args) } /* We're lazy and allocate to much (fixed up later) */ - if ( (rv=PyBytes_FromStringAndSize(NULL, bin_len*2+2)) == NULL ) { + if ( (rv=PyBytes_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL ) { PyBuffer_Release(&pbin); return NULL; }