Issue #25384: Fix binascii.rledecode_hqx()

Fix usage of _PyBytesWriter API. Use the new _PyBytesWriter_Resize() function
instead of _PyBytesWriter_Prepare().
This commit is contained in:
Victor Stinner 2015-10-14 15:02:35 +02:00
parent c3d2bc19e4
commit 1bfe930585
2 changed files with 22 additions and 5 deletions

View File

@ -159,11 +159,25 @@ class BinASCIITest(unittest.TestCase):
# Then calculate the hexbin4 binary-to-ASCII translation # Then calculate the hexbin4 binary-to-ASCII translation
rle = binascii.rlecode_hqx(self.data) rle = binascii.rlecode_hqx(self.data)
a = binascii.b2a_hqx(self.type2test(rle)) a = binascii.b2a_hqx(self.type2test(rle))
b, _ = binascii.a2b_hqx(self.type2test(a)) b, _ = binascii.a2b_hqx(self.type2test(a))
res = binascii.rledecode_hqx(b) res = binascii.rledecode_hqx(b)
self.assertEqual(res, self.rawdata) self.assertEqual(res, self.rawdata)
def test_rle(self):
# test repetition with a repetition longer than the limit of 255
data = (b'a' * 100 + b'b' + b'c' * 300)
encoded = binascii.rlecode_hqx(data)
self.assertEqual(encoded,
(b'a\x90d' # 'a' * 100
b'b' # 'b'
b'c\x90\xff' # 'c' * 255
b'c\x90-')) # 'c' * 45
decoded = binascii.rledecode_hqx(encoded)
self.assertEqual(decoded, data)
def test_hex(self): def test_hex(self):
# test hexlification # test hexlification
s = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' s = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'

View File

@ -800,14 +800,15 @@ binascii_rledecode_hqx_impl(PyModuleDef *module, Py_buffer *data)
return PyErr_NoMemory(); return PyErr_NoMemory();
/* Allocate a buffer of reasonable size. Resized when needed */ /* Allocate a buffer of reasonable size. Resized when needed */
out_len = in_len * 2; out_len = in_len;
out_data = _PyBytesWriter_Alloc(&writer, out_len); out_data = _PyBytesWriter_Alloc(&writer, out_len);
if (out_data == NULL) if (out_data == NULL)
return NULL; return NULL;
/* Use overallocation */ /* Use overallocation */
writer.overallocate = 1; writer.overallocate = 1;
out_len_left = writer.allocated; out_len = writer.allocated;
out_len_left = out_len;
/* /*
** We need two macros here to get/put bytes and handle ** We need two macros here to get/put bytes and handle
@ -830,10 +831,12 @@ binascii_rledecode_hqx_impl(PyModuleDef *module, Py_buffer *data)
overallocate the buffer anymore */ \ overallocate the buffer anymore */ \
writer.overallocate = 0; \ writer.overallocate = 0; \
} \ } \
out_data = _PyBytesWriter_Prepare(&writer, out_data, 1); \ out_data = _PyBytesWriter_Resize(&writer, out_data, \
writer.allocated + 1); \
if (out_data == NULL) \ if (out_data == NULL) \
goto error; \ goto error; \
out_len_left = writer.allocated; \ out_len_left = writer.allocated - out_len - 1; \
out_len = writer.allocated; \
} \ } \
*out_data++ = b; \ *out_data++ = b; \
} while(0) } while(0)