Fix refleak introduced by #10812.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index f873a7a..8f17bf4 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -3827,16 +3827,19 @@
return NULL;
}
for (i = 0; i < *argc; i++) {
- if (!fsconvert_strdup(PySequence_ITEM(argv, i),
- &argvlist[i]))
- {
- *argc = i;
+ PyObject* item = PySequence_ITEM(argv, i);
+ if (item == NULL)
+ goto fail;
+ if (!fsconvert_strdup(item, &argvlist[i])) {
+ Py_DECREF(item);
goto fail;
}
+ Py_DECREF(item);
}
argvlist[*argc] = NULL;
return argvlist;
fail:
+ *argc = i;
free_string_array(argvlist, *argc);
return NULL;
}
@@ -6177,22 +6180,28 @@
}
for (i = 0; i < cnt; i++) {
- if (PyObject_GetBuffer(PySequence_GetItem(seq, i),
- &(*buf)[i], type) == -1) {
- PyMem_Del(*iov);
- for (j = 0; j < i; j++) {
- PyBuffer_Release(&(*buf)[j]);
- }
- PyMem_Del(*buf);
- total = 0;
- return total;
+ PyObject *item = PySequence_GetItem(seq, i);
+ if (item == NULL)
+ goto fail;
+ if (PyObject_GetBuffer(item, &(*buf)[i], type) == -1) {
+ Py_DECREF(item);
+ goto fail;
}
+ Py_DECREF(item);
(*iov)[i].iov_base = (*buf)[i].buf;
blen = (*buf)[i].len;
(*iov)[i].iov_len = blen;
total += blen;
}
return total;
+
+fail:
+ PyMem_Del(*iov);
+ for (j = 0; j < i; j++) {
+ PyBuffer_Release(&(*buf)[j]);
+ }
+ PyMem_Del(*buf);
+ return 0;
}
static void