diff --git a/Modules/_struct.c b/Modules/_struct.c index ba276b364ec..328acd9e46f 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -1487,29 +1487,33 @@ s_unpack(PyObject *self, PyObject *inputstr) { char *start; int len; - PyObject * args; + PyObject *args=NULL, *result; PyStructObject *soself = (PyStructObject *)self; assert(PyStruct_Check(self)); assert(soself->s_codes != NULL); - if (inputstr != NULL && PyString_Check(inputstr) && + 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)); } args = PyTuple_Pack(1, inputstr); if (args == NULL) return NULL; - if (!PyArg_ParseTuple(args, "s#:unpack", &start, &len)) { - Py_DECREF(args); - 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); - if (soself->s_size != len) { - PyErr_Format(StructError, - "unpack requires a string argument of length %zd", - soself->s_size); - return NULL; - } - return s_unpack_internal(soself, start); + 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__,