From 9ad63e091448d8778cde67fce8619baaab7cf10b Mon Sep 17 00:00:00 2001 From: Ross Lagerwall Date: Sat, 19 Mar 2011 09:11:14 +0200 Subject: Fix refleak introduced by #10812. --- Modules/posixmodule.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) 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 @@ parse_arglist(PyObject* argv, Py_ssize_t *argc) 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 @@ iov_setup(struct iovec **iov, Py_buffer **buf, PyObject *seq, int cnt, int type) } 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 -- cgit v0.12