Fix-up error-exits on struct_unpack().
diff --git a/Modules/_struct.c b/Modules/_struct.c
index ba276b3..328acd9 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -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__,