diff options
author | Raymond Hettinger <python@rcn.com> | 2007-04-05 18:00:03 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2007-04-05 18:00:03 (GMT) |
commit | 7a3d41f4ca7a94267063ee50250ed5199ba8daf5 (patch) | |
tree | d20bb061ef6e96a2d3a08297ba354d4341aa33ab /Modules/_struct.c | |
parent | 18ffe42b4b88699b8e030c5d8b0e79593b18dab1 (diff) | |
download | cpython-7a3d41f4ca7a94267063ee50250ed5199ba8daf5.zip cpython-7a3d41f4ca7a94267063ee50250ed5199ba8daf5.tar.gz cpython-7a3d41f4ca7a94267063ee50250ed5199ba8daf5.tar.bz2 |
Bug #1563759: struct.unpack doens't support buffer protocol objects
Diffstat (limited to 'Modules/_struct.c')
-rw-r--r-- | Modules/_struct.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/Modules/_struct.c b/Modules/_struct.c index 059d988..a4c82f7 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1534,17 +1534,35 @@ strings."); static PyObject * s_unpack(PyObject *self, PyObject *inputstr) { + char *start; + Py_ssize_t len; + PyObject *args=NULL, *result; PyStructObject *soself = (PyStructObject *)self; assert(PyStruct_Check(self)); assert(soself->s_codes != NULL); - if (inputstr == NULL || !PyString_Check(inputstr) || - PyString_GET_SIZE(inputstr) != soself->s_size) { - PyErr_Format(StructError, - "unpack requires a string argument of length %zd", - soself->s_size); - return NULL; + if (inputstr == NULL) + goto fail; + if (PyString_Check(inputstr) && + PyString_GET_SIZE(inputstr) == soself->s_size) { + return s_unpack_internal(soself, PyString_AS_STRING(inputstr)); } - return s_unpack_internal(soself, PyString_AS_STRING(inputstr)); + args = PyTuple_Pack(1, inputstr); + if (args == NULL) + return NULL; + if (!PyArg_ParseTuple(args, "s#:unpack", &start, &len)) + goto fail; + if (soself->s_size != len) + goto fail; + result = s_unpack_internal(soself, start); + Py_DECREF(args); + return result; + +fail: + Py_XDECREF(args); + PyErr_Format(StructError, + "unpack requires a string argument of length %zd", + soself->s_size); + return NULL; } PyDoc_STRVAR(s_unpack_from__doc__, |