]> granicus.if.org Git - python/commitdiff
The 'p' (Pascal string) pack code acts unreasonably when the string size
authorTim Peters <tim.peters@gmail.com>
Sat, 15 Sep 2001 02:35:15 +0000 (02:35 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 15 Sep 2001 02:35:15 +0000 (02:35 +0000)
and count exceed 255.  Changed to preserve as much of the string as
possible (instead of count%256 characters).

Lib/test/test_struct.py
Modules/structmodule.c

index 0f3ac91a39230211165979b026540a0435918e19..34abad55ea267cfb485903abef5cce0319a3c074 100644 (file)
@@ -368,3 +368,28 @@ for args in [("bB", 1),
              ("qQ", 8)]:
     t = IntTester(*args)
     t.run()
+
+
+###########################################################################
+# The p ("Pascal string") code.
+
+def test_p_code():
+    for code, input, expected, expectedback in [
+            ('p','abc', '\x00', ''),
+            ('1p', 'abc', '\x00', ''),
+            ('2p', 'abc', '\x01a', 'a'),
+            ('3p', 'abc', '\x02ab', 'ab'),
+            ('4p', 'abc', '\x03abc', 'abc'),
+            ('5p', 'abc', '\x03abc\x00', 'abc'),
+            ('6p', 'abc', '\x03abc\x00\x00', 'abc'),
+            ('1000p', 'x'*1000, '\xff' + 'x'*999, 'x'*255)]:
+        got = struct.pack(code, input)
+        if got != expected:
+            raise TestFailed("pack(%r, %r) == %r but expected %r" %
+                             (code, input, got, expected))
+        (got,) = struct.unpack(code, got)
+        if got != expectedback:
+            raise TestFailed("unpack(%r, %r) == %r but expected %r" %
+                             (code, input, got, expectedback))
+
+test_p_code()
index 46aa75bd53ff39abcbbd4cb9f02321ecdd20555e..61436f92a8b82696d4d18c5dccd793a47ae84b28 100644 (file)
@@ -1360,6 +1360,8 @@ struct_pack(PyObject *self, PyObject *args)
                                if (n < num)
                                        /* no real need, just to be nice */
                                        memset(res+1+n, '\0', num-n);
+                               if (n > 255)
+                                       n = 255;
                                *res++ = n; /* store the length byte */
                                res += num;
                                break;