mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
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).
This commit is contained in:
parent
1048aa933f
commit
0891ac017d
2 changed files with 27 additions and 0 deletions
|
@ -368,3 +368,28 @@ for args in [("bB", 1),
|
||||||
("qQ", 8)]:
|
("qQ", 8)]:
|
||||||
t = IntTester(*args)
|
t = IntTester(*args)
|
||||||
t.run()
|
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)
|
if (n < num)
|
||||||
/* no real need, just to be nice */
|
/* no real need, just to be nice */
|
||||||
memset(res+1+n, '\0', num-n);
|
memset(res+1+n, '\0', num-n);
|
||||||
|
if (n > 255)
|
||||||
|
n = 255;
|
||||||
*res++ = n; /* store the length byte */
|
*res++ = n; /* store the length byte */
|
||||||
res += num;
|
res += num;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue