From 46d410616d91afbcfff6ac9ece42b01c2cbb86e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sat, 13 Dec 2008 14:34:06 +0000 Subject: [PATCH] Issue #4228: Pack negative values the same way as 2.4 in struct's L format. --- Lib/test/test_struct.py | 13 +++++++++++++ Misc/NEWS | 2 ++ Modules/_struct.c | 12 ++++++------ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 7ecb6ac9a04..f13515000f8 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 97efe211e57..a98ae2c223a 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 41183fa26b5..e2a883de830 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; }