@@ -1852,6 +1852,17 @@ posix__exit(PyObject *self, PyObject *args)
18521852 return NULL ; /* Make gcc -Wall happy */
18531853}
18541854
1855+ #if defined(HAVE_EXECV ) || defined(HAVE_SPAWNV )
1856+ static void
1857+ free_string_array (char * * array , int count )
1858+ {
1859+ int i ;
1860+ for (i = 0 ; i < count ; i ++ )
1861+ PyMem_Free (array [i ]);
1862+ PyMem_DEL (array );
1863+ }
1864+ #endif
1865+
18551866
18561867#ifdef HAVE_EXECV
18571868PyDoc_STRVAR (posix_execv__doc__ ,
@@ -1873,7 +1884,9 @@ posix_execv(PyObject *self, PyObject *args)
18731884 /* execv has two arguments: (path, argv), where
18741885 argv is a list or tuple of strings. */
18751886
1876- if (!PyArg_ParseTuple (args , "sO:execv" , & path , & argv ))
1887+ if (!PyArg_ParseTuple (args , "etO:execv" ,
1888+ Py_FileSystemDefaultEncoding ,
1889+ & path , & argv ))
18771890 return NULL ;
18781891 if (PyList_Check (argv )) {
18791892 argc = PyList_Size (argv );
@@ -1885,22 +1898,29 @@ posix_execv(PyObject *self, PyObject *args)
18851898 }
18861899 else {
18871900 PyErr_SetString (PyExc_TypeError , "execv() arg 2 must be a tuple or list" );
1901+ PyMem_Free (path );
18881902 return NULL ;
18891903 }
18901904
18911905 if (argc == 0 ) {
18921906 PyErr_SetString (PyExc_ValueError , "execv() arg 2 must not be empty" );
1907+ PyMem_Free (path );
18931908 return NULL ;
18941909 }
18951910
18961911 argvlist = PyMem_NEW (char * , argc + 1 );
1897- if (argvlist == NULL )
1912+ if (argvlist == NULL ) {
1913+ PyMem_Free (path );
18981914 return NULL ;
1915+ }
18991916 for (i = 0 ; i < argc ; i ++ ) {
1900- if (!PyArg_Parse ((* getitem )(argv , i ), "s" , & argvlist [i ])) {
1901- PyMem_DEL (argvlist );
1917+ if (!PyArg_Parse ((* getitem )(argv , i ), "et" ,
1918+ Py_FileSystemDefaultEncoding ,
1919+ & argvlist [i ])) {
1920+ free_string_array (argvlist , i );
19021921 PyErr_SetString (PyExc_TypeError ,
19031922 "execv() arg 2 must contain only strings" );
1923+ PyMem_Free (path );
19041924 return NULL ;
19051925
19061926 }
@@ -1915,7 +1935,8 @@ posix_execv(PyObject *self, PyObject *args)
19151935
19161936 /* If we get here it's definitely an error */
19171937
1918- PyMem_DEL (argvlist );
1938+ free_string_array (argvlist , argc );
1939+ PyMem_Free (path );
19191940 return posix_error ();
19201941}
19211942
@@ -1938,12 +1959,15 @@ posix_execve(PyObject *self, PyObject *args)
19381959 PyObject * key , * val , * keys = NULL , * vals = NULL ;
19391960 int i , pos , argc , envc ;
19401961 PyObject * (* getitem )(PyObject * , int );
1962+ int lastarg = 0 ;
19411963
19421964 /* execve has three arguments: (path, argv, env), where
19431965 argv is a list or tuple of strings and env is a dictionary
19441966 like posix.environ. */
19451967
1946- if (!PyArg_ParseTuple (args , "sOO:execve" , & path , & argv , & env ))
1968+ if (!PyArg_ParseTuple (args , "etOO:execve" ,
1969+ Py_FileSystemDefaultEncoding ,
1970+ & path , & argv , & env ))
19471971 return NULL ;
19481972 if (PyList_Check (argv )) {
19491973 argc = PyList_Size (argv );
@@ -1955,32 +1979,34 @@ posix_execve(PyObject *self, PyObject *args)
19551979 }
19561980 else {
19571981 PyErr_SetString (PyExc_TypeError , "execve() arg 2 must be a tuple or list" );
1958- return NULL ;
1982+ goto fail_0 ;
19591983 }
19601984 if (!PyMapping_Check (env )) {
19611985 PyErr_SetString (PyExc_TypeError , "execve() arg 3 must be a mapping object" );
1962- return NULL ;
1986+ goto fail_0 ;
19631987 }
19641988
19651989 if (argc == 0 ) {
19661990 PyErr_SetString (PyExc_ValueError ,
19671991 "execve() arg 2 must not be empty" );
1968- return NULL ;
1992+ goto fail_0 ;
19691993 }
19701994
19711995 argvlist = PyMem_NEW (char * , argc + 1 );
19721996 if (argvlist == NULL ) {
19731997 PyErr_NoMemory ();
1974- return NULL ;
1998+ goto fail_0 ;
19751999 }
19762000 for (i = 0 ; i < argc ; i ++ ) {
19772001 if (!PyArg_Parse ((* getitem )(argv , i ),
1978- "s ;execve() arg 2 must contain only strings" ,
2002+ "et ;execve() arg 2 must contain only strings" ,
19792003 & argvlist [i ]))
19802004 {
2005+ lastarg = i ;
19812006 goto fail_1 ;
19822007 }
19832008 }
2009+ lastarg = argc ;
19842010 argvlist [argc ] = NULL ;
19852011
19862012 i = PyMapping_Size (env );
@@ -2044,9 +2070,11 @@ posix_execve(PyObject *self, PyObject *args)
20442070 PyMem_DEL (envlist [envc ]);
20452071 PyMem_DEL (envlist );
20462072 fail_1 :
2047- PyMem_DEL (argvlist );
2073+ free_string_array (argvlist , lastarg );
20482074 Py_XDECREF (vals );
20492075 Py_XDECREF (keys );
2076+ fail_0 :
2077+ PyMem_Free (path );
20502078 return NULL ;
20512079}
20522080#endif /* HAVE_EXECV */
@@ -2074,7 +2102,9 @@ posix_spawnv(PyObject *self, PyObject *args)
20742102 /* spawnv has three arguments: (mode, path, argv), where
20752103 argv is a list or tuple of strings. */
20762104
2077- if (!PyArg_ParseTuple (args , "isO:spawnv" , & mode , & path , & argv ))
2105+ if (!PyArg_ParseTuple (args , "ietO:spawnv" , & mode ,
2106+ Py_FileSystemDefaultEncoding ,
2107+ & path , & argv ))
20782108 return NULL ;
20792109 if (PyList_Check (argv )) {
20802110 argc = PyList_Size (argv );
@@ -2086,17 +2116,23 @@ posix_spawnv(PyObject *self, PyObject *args)
20862116 }
20872117 else {
20882118 PyErr_SetString (PyExc_TypeError , "spawnv() arg 2 must be a tuple or list" );
2119+ PyMem_Free (path );
20892120 return NULL ;
20902121 }
20912122
20922123 argvlist = PyMem_NEW (char * , argc + 1 );
2093- if (argvlist == NULL )
2124+ if (argvlist == NULL ) {
2125+ PyMem_Free (path );
20942126 return NULL ;
2127+ }
20952128 for (i = 0 ; i < argc ; i ++ ) {
2096- if (!PyArg_Parse ((* getitem )(argv , i ), "s" , & argvlist [i ])) {
2097- PyMem_DEL (argvlist );
2129+ if (!PyArg_Parse ((* getitem )(argv , i ), "et" ,
2130+ Py_FileSystemDefaultEncoding ,
2131+ & argvlist [i ])) {
2132+ free_string_array (argvlist , i );
20982133 PyErr_SetString (PyExc_TypeError ,
20992134 "spawnv() arg 2 must contain only strings" );
2135+ PyMem_Free (path );
21002136 return NULL ;
21012137 }
21022138 }
@@ -2115,7 +2151,8 @@ posix_spawnv(PyObject *self, PyObject *args)
21152151 Py_END_ALLOW_THREADS
21162152#endif
21172153
2118- PyMem_DEL (argvlist );
2154+ free_string_array (argvlist , argc );
2155+ PyMem_Free (path );
21192156
21202157 if (spawnval == -1 )
21212158 return posix_error ();
@@ -2148,12 +2185,15 @@ posix_spawnve(PyObject *self, PyObject *args)
21482185 int mode , i , pos , argc , envc ;
21492186 Py_intptr_t spawnval ;
21502187 PyObject * (* getitem )(PyObject * , int );
2188+ int lastarg = 0 ;
21512189
21522190 /* spawnve has four arguments: (mode, path, argv, env), where
21532191 argv is a list or tuple of strings and env is a dictionary
21542192 like posix.environ. */
21552193
2156- if (!PyArg_ParseTuple (args , "isOO:spawnve" , & mode , & path , & argv , & env ))
2194+ if (!PyArg_ParseTuple (args , "ietOO:spawnve" , & mode ,
2195+ Py_FileSystemDefaultEncoding ,
2196+ & path , & argv , & env ))
21572197 return NULL ;
21582198 if (PyList_Check (argv )) {
21592199 argc = PyList_Size (argv );
@@ -2165,26 +2205,29 @@ posix_spawnve(PyObject *self, PyObject *args)
21652205 }
21662206 else {
21672207 PyErr_SetString (PyExc_TypeError , "spawnve() arg 2 must be a tuple or list" );
2168- return NULL ;
2208+ goto fail_0 ;
21692209 }
21702210 if (!PyMapping_Check (env )) {
21712211 PyErr_SetString (PyExc_TypeError , "spawnve() arg 3 must be a mapping object" );
2172- return NULL ;
2212+ goto fail_0 ;
21732213 }
21742214
21752215 argvlist = PyMem_NEW (char * , argc + 1 );
21762216 if (argvlist == NULL ) {
21772217 PyErr_NoMemory ();
2178- return NULL ;
2218+ goto fail_0 ;
21792219 }
21802220 for (i = 0 ; i < argc ; i ++ ) {
21812221 if (!PyArg_Parse ((* getitem )(argv , i ),
2182- "s;spawnve() arg 2 must contain only strings" ,
2222+ "et;spawnve() arg 2 must contain only strings" ,
2223+ Py_FileSystemDefaultEncoding ,
21832224 & argvlist [i ]))
21842225 {
2226+ lastarg = i ;
21852227 goto fail_1 ;
21862228 }
21872229 }
2230+ lastarg = argc ;
21882231 argvlist [argc ] = NULL ;
21892232
21902233 i = PyMapping_Size (env );
@@ -2251,9 +2294,11 @@ posix_spawnve(PyObject *self, PyObject *args)
22512294 PyMem_DEL (envlist [envc ]);
22522295 PyMem_DEL (envlist );
22532296 fail_1 :
2254- PyMem_DEL (argvlist );
2297+ free_string_array (argvlist , lastarg );
22552298 Py_XDECREF (vals );
22562299 Py_XDECREF (keys );
2300+ fail_0 :
2301+ PyMem_Free (path );
22572302 return res ;
22582303}
22592304#endif /* HAVE_SPAWNV */
0 commit comments