[Python-checkins] cpython: Issue #25384: Fix binascii.rledecode_hqx()

victor.stinner python-checkins at python.org
Wed Oct 14 09:31:45 EDT 2015


https://hg.python.org/cpython/rev/32b17c3b3cf3
changeset:   98752:32b17c3b3cf3
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Oct 14 15:02:35 2015 +0200
summary:
  Issue #25384: Fix binascii.rledecode_hqx()

Fix usage of _PyBytesWriter API. Use the new _PyBytesWriter_Resize() function
instead of _PyBytesWriter_Prepare().

files:
  Lib/test/test_binascii.py |  16 +++++++++++++++-
  Modules/binascii.c        |  11 +++++++----
  2 files changed, 22 insertions(+), 5 deletions(-)


diff --git a/Lib/test/test_binascii.py b/Lib/test/test_binascii.py
--- a/Lib/test/test_binascii.py
+++ b/Lib/test/test_binascii.py
@@ -159,10 +159,24 @@
         # Then calculate the hexbin4 binary-to-ASCII translation
         rle = binascii.rlecode_hqx(self.data)
         a = binascii.b2a_hqx(self.type2test(rle))
+
         b, _ = binascii.a2b_hqx(self.type2test(a))
         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):
         # test hexlification
diff --git a/Modules/binascii.c b/Modules/binascii.c
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -800,14 +800,15 @@
         return PyErr_NoMemory();
 
     /* 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);
     if (out_data == NULL)
         return NULL;
 
     /* Use overallocation */
     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
@@ -830,10 +831,12 @@
                     overallocate the buffer anymore */                  \
                  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)                                      \
                  goto error;                                            \
-             out_len_left = writer.allocated;                           \
+             out_len_left = writer.allocated - out_len - 1;             \
+             out_len = writer.allocated;                                \
          }                                                              \
          *out_data++ = b;                                               \
     } while(0)

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list