Kaydet (Commit) 0891ac01 authored tarafından Tim Peters's avatar Tim Peters

The 'p' (Pascal string) pack code acts unreasonably when the string size

and count exceed 255.  Changed to preserve as much of the string as
possible (instead of count%256 characters).
üst 1048aa93
......@@ -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()
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment