Issue #4228: Pack negative values the same way as 2.4

in struct's L format.
This commit is contained in:
Martin v. Löwis 2008-12-13 14:34:06 +00:00
parent ec96c0205b
commit 46d410616d
3 changed files with 21 additions and 6 deletions

View File

@ -3,6 +3,8 @@ import test.test_support
import struct
import array
import warnings
warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated",
DeprecationWarning)
import sys
ISBIGENDIAN = sys.byteorder == "big"
@ -535,6 +537,17 @@ def test_1530559():
test_1530559()
## Issue 4228. Packing a negative unsigned long warns,
# but then still should give a value with the
# topmost bit set.
def test_issue4228():
# Packing a long may yield either 32 or 64 bits
x = struct.pack('L', -1)[:4]
vereq(x, '\xff'*4)
test_issue4228()
###########################################################################
# Packing and unpacking to/from buffers.

View File

@ -217,6 +217,8 @@ Library
Extension Modules
-----------------
- Issue #4228: Pack negative values the same way as 2.4 in struct's L format.
- Security Issue #2: imageop did not validate arguments correctly and could
segfault as a result.

View File

@ -645,7 +645,7 @@ np_int(char *p, PyObject *v, const formatdef *f)
return -1;
#if (SIZEOF_LONG > SIZEOF_INT)
if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
return _range_error(f, 0);
RANGE_ERROR(x, f, 0, -1);
#endif
y = (int)x;
memcpy(p, (char *)&y, sizeof y);
@ -657,12 +657,12 @@ np_uint(char *p, PyObject *v, const formatdef *f)
{
unsigned long x;
unsigned int y;
if (get_ulong(v, &x) < 0)
return _range_error(f, 1);
if (get_wrapped_ulong(v, &x) < 0)
return -1;
y = (unsigned int)x;
#if (SIZEOF_LONG > SIZEOF_INT)
if (x > ((unsigned long)UINT_MAX))
return _range_error(f, 1);
RANGE_ERROR(y, f, 1, -1);
#endif
memcpy(p, (char *)&y, sizeof y);
return 0;
@ -682,8 +682,8 @@ static int
np_ulong(char *p, PyObject *v, const formatdef *f)
{
unsigned long x;
if (get_ulong(v, &x) < 0)
return _range_error(f, 1);
if (get_wrapped_ulong(v, &x) < 0)
return -1;
memcpy(p, (char *)&x, sizeof x);
return 0;
}