Commit 46d41061 authored by Martin v. Löwis's avatar Martin v. Löwis

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

in struct's L format.
parent ec96c020
...@@ -3,6 +3,8 @@ import test.test_support ...@@ -3,6 +3,8 @@ import test.test_support
import struct import struct
import array import array
import warnings import warnings
warnings.filterwarnings("ignore", "struct integer overflow masking is deprecated",
DeprecationWarning)
import sys import sys
ISBIGENDIAN = sys.byteorder == "big" ISBIGENDIAN = sys.byteorder == "big"
...@@ -535,6 +537,17 @@ def test_1530559(): ...@@ -535,6 +537,17 @@ def test_1530559():
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. # Packing and unpacking to/from buffers.
......
...@@ -217,6 +217,8 @@ Library ...@@ -217,6 +217,8 @@ Library
Extension Modules 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 - Security Issue #2: imageop did not validate arguments correctly and could
segfault as a result. segfault as a result.
......
...@@ -645,7 +645,7 @@ np_int(char *p, PyObject *v, const formatdef *f) ...@@ -645,7 +645,7 @@ np_int(char *p, PyObject *v, const formatdef *f)
return -1; return -1;
#if (SIZEOF_LONG > SIZEOF_INT) #if (SIZEOF_LONG > SIZEOF_INT)
if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX))) if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))
return _range_error(f, 0); RANGE_ERROR(x, f, 0, -1);
#endif #endif
y = (int)x; y = (int)x;
memcpy(p, (char *)&y, sizeof y); memcpy(p, (char *)&y, sizeof y);
...@@ -657,12 +657,12 @@ np_uint(char *p, PyObject *v, const formatdef *f) ...@@ -657,12 +657,12 @@ np_uint(char *p, PyObject *v, const formatdef *f)
{ {
unsigned long x; unsigned long x;
unsigned int y; unsigned int y;
if (get_ulong(v, &x) < 0) if (get_wrapped_ulong(v, &x) < 0)
return _range_error(f, 1); return -1;
y = (unsigned int)x; y = (unsigned int)x;
#if (SIZEOF_LONG > SIZEOF_INT) #if (SIZEOF_LONG > SIZEOF_INT)
if (x > ((unsigned long)UINT_MAX)) if (x > ((unsigned long)UINT_MAX))
return _range_error(f, 1); RANGE_ERROR(y, f, 1, -1);
#endif #endif
memcpy(p, (char *)&y, sizeof y); memcpy(p, (char *)&y, sizeof y);
return 0; return 0;
...@@ -682,8 +682,8 @@ static int ...@@ -682,8 +682,8 @@ static int
np_ulong(char *p, PyObject *v, const formatdef *f) np_ulong(char *p, PyObject *v, const formatdef *f)
{ {
unsigned long x; unsigned long x;
if (get_ulong(v, &x) < 0) if (get_wrapped_ulong(v, &x) < 0)
return _range_error(f, 1); return -1;
memcpy(p, (char *)&x, sizeof x); memcpy(p, (char *)&x, sizeof x);
return 0; return 0;
} }
......
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