summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2008-12-13 14:34:06 +0000
committerMartin v. Löwis <martin@v.loewis.de>2008-12-13 14:34:06 +0000
commit46d410616d91afbcfff6ac9ece42b01c2cbb86e0 (patch)
treecf3ffad9c1dd18fdc83b815049e3abbbb32207df
parentec96c0205bb77236bb87e4c1c5295b40a798bde8 (diff)
downloadcpython-git-46d410616d91afbcfff6ac9ece42b01c2cbb86e0.tar.gz
Issue #4228: Pack negative values the same way as 2.4
in struct's L format.
-rw-r--r--Lib/test/test_struct.py13
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_struct.c12
3 files changed, 21 insertions, 6 deletions
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 7ecb6ac9a0..f13515000f 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -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.
diff --git a/Misc/NEWS b/Misc/NEWS
index 97efe211e5..a98ae2c223 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
diff --git a/Modules/_struct.c b/Modules/_struct.c
index 41183fa26b..e2a883de83 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -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;
}