[Python-checkins] r54691 - python/branches/release25-maint/Modules/_struct.c

raymond.hettinger python-checkins at python.org
Wed Apr 4 23:57:15 CEST 2007


Author: raymond.hettinger
Date: Wed Apr  4 23:57:12 2007
New Revision: 54691

Modified:
   python/branches/release25-maint/Modules/_struct.c
Log:
Fix-up error-exits on struct_unpack().

Modified: python/branches/release25-maint/Modules/_struct.c
==============================================================================
--- python/branches/release25-maint/Modules/_struct.c	(original)
+++ python/branches/release25-maint/Modules/_struct.c	Wed Apr  4 23:57:12 2007
@@ -1487,29 +1487,33 @@
 {
 	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__,


More information about the Python-checkins mailing list