summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2007-04-05 18:00:03 (GMT)
committerRaymond Hettinger <python@rcn.com>2007-04-05 18:00:03 (GMT)
commit7a3d41f4ca7a94267063ee50250ed5199ba8daf5 (patch)
treed20bb061ef6e96a2d3a08297ba354d4341aa33ab /Modules
parent18ffe42b4b88699b8e030c5d8b0e79593b18dab1 (diff)
downloadcpython-7a3d41f4ca7a94267063ee50250ed5199ba8daf5.zip
cpython-7a3d41f4ca7a94267063ee50250ed5199ba8daf5.tar.gz
cpython-7a3d41f4ca7a94267063ee50250ed5199ba8daf5.tar.bz2
Bug #1563759: struct.unpack doens't support buffer protocol objects
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_struct.c32
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__,