]> granicus.if.org Git - python/commitdiff
Fix-up error-exits on struct_unpack().
authorRaymond Hettinger <python@rcn.com>
Wed, 4 Apr 2007 21:57:12 +0000 (21:57 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 4 Apr 2007 21:57:12 +0000 (21:57 +0000)
Modules/_struct.c

index ba276b364ec942c9cb8d23fbdf42076b8a330ec5..328acd9e46f4318d32e720172334ed0d6d2a8084 100644 (file)
@@ -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__,