Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 114619e

Browse files
committed
Apply file system default encoding to exec and spawn path and arguments.
1 parent aa5afe1 commit 114619e

1 file changed

Lines changed: 68 additions & 23 deletions

File tree

Modules/posixmodule.c

Lines changed: 68 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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
18571868
PyDoc_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

Comments
 (0)