From: Victor Stinner Date: Wed, 14 Jun 2017 12:26:21 +0000 (+0200) Subject: bpo-30602: Fix refleak in os.spawnve() (#2184) X-Git-Tag: v3.7.0a1~594 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=526b22657cb18fe79118c2ea68511aca09430c2c;p=thirdparty%2FPython%2Fcpython.git bpo-30602: Fix refleak in os.spawnve() (#2184) When os.spawnve() fails while handling arguments, free correctly argvlist: pass lastarg+1 rather than lastarg to free_string_array() to also free the first item. --- diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6b1e435b1298..470702981308 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -5223,7 +5223,7 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, Py_ssize_t argc, i, envc; intptr_t spawnval; PyObject *(*getitem)(PyObject *, Py_ssize_t); - Py_ssize_t lastarg = 0; + Py_ssize_t lastarg = -1; /* spawnve has four arguments: (mode, path, argv, env), where argv is a list or tuple of strings and env is a dictionary @@ -5302,7 +5302,7 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv, PyMem_DEL(envlist[envc]); PyMem_DEL(envlist); fail_1: - free_string_array(argvlist, lastarg); + free_string_array(argvlist, lastarg + 1); fail_0: return res; }