From: Armin Rigo Date: Mon, 27 Sep 2004 19:27:51 +0000 (+0000) Subject: Patch #1011240: SystemError generated by struct.pack('P', 'foo'). X-Git-Tag: v2.4b1~161 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9f904398179bcbab4bf21b2500aa14aec01fbdb3;p=python Patch #1011240: SystemError generated by struct.pack('P', 'foo'). --- diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py index 0641d9ba45..933246639c 100644 --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -54,6 +54,7 @@ if sz * 3 != sz3: simple_err(struct.pack, 'iii', 3) simple_err(struct.pack, 'i', 3, 3, 3) simple_err(struct.pack, 'i', 'foo') +simple_err(struct.pack, 'P', 'foo') simple_err(struct.unpack, 'd', 'flap') s = struct.pack('ii', 1, 2) simple_err(struct.unpack, 'iii', s) diff --git a/Modules/structmodule.c b/Modules/structmodule.c index b78231f4d3..33134e920b 100644 --- a/Modules/structmodule.c +++ b/Modules/structmodule.c @@ -518,14 +518,16 @@ np_double(char *p, PyObject *v, const formatdef *f) static int np_void_p(char *p, PyObject *v, const formatdef *f) { - void *x = PyLong_AsVoidPtr(v); - if (x == NULL && PyErr_Occurred()) { - /* ### hrm. PyLong_AsVoidPtr raises SystemError */ - if (PyErr_ExceptionMatches(PyExc_TypeError)) - PyErr_SetString(StructError, - "required argument is not an integer"); + void *x; + + v = get_pylong(v); + if (v == NULL) + return -1; + assert(PyLong_Check(v)); + x = PyLong_AsVoidPtr(v); + Py_DECREF(v); + if (x == NULL && PyErr_Occurred()) return -1; - } memcpy(p, (char *)&x, sizeof x); return 0; }