mirror of
https://github.com/python/cpython.git
synced 2025-11-03 19:34:08 +00:00
posix_execve(): Accept any mapping protocol object for the env
argument, not hardwired to a dictionary.
This commit is contained in:
parent
4acdc2327f
commit
5ed19dcc0e
1 changed files with 18 additions and 7 deletions
|
|
@ -842,7 +842,7 @@ posix_execve(self, args)
|
||||||
PyObject *argv, *env;
|
PyObject *argv, *env;
|
||||||
char **argvlist;
|
char **argvlist;
|
||||||
char **envlist;
|
char **envlist;
|
||||||
PyObject *key, *val;
|
PyObject *key, *val, *keys=NULL, *vals=NULL;
|
||||||
int i, pos, argc, envc;
|
int i, pos, argc, envc;
|
||||||
PyObject *(*getitem) Py_PROTO((PyObject *, int));
|
PyObject *(*getitem) Py_PROTO((PyObject *, int));
|
||||||
|
|
||||||
|
|
@ -864,8 +864,8 @@ posix_execve(self, args)
|
||||||
PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
|
PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!PyDict_Check(env)) {
|
if (!PyMapping_Check(env)) {
|
||||||
PyErr_SetString(PyExc_TypeError, "env must be dictionary");
|
PyErr_SetString(PyExc_TypeError, "env must be mapping object");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -884,16 +884,26 @@ posix_execve(self, args)
|
||||||
}
|
}
|
||||||
argvlist[argc] = NULL;
|
argvlist[argc] = NULL;
|
||||||
|
|
||||||
i = PyDict_Size(env);
|
i = PyMapping_Length(env);
|
||||||
envlist = PyMem_NEW(char *, i + 1);
|
envlist = PyMem_NEW(char *, i + 1);
|
||||||
if (envlist == NULL) {
|
if (envlist == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
goto fail_1;
|
goto fail_1;
|
||||||
}
|
}
|
||||||
pos = 0;
|
|
||||||
envc = 0;
|
envc = 0;
|
||||||
while (PyDict_Next(env, &pos, &key, &val)) {
|
keys = PyMapping_Keys(env);
|
||||||
|
vals = PyMapping_Values(env);
|
||||||
|
if (!keys || !vals)
|
||||||
|
goto fail_2;
|
||||||
|
|
||||||
|
for (pos = 0; pos < i; pos++) {
|
||||||
char *p, *k, *v;
|
char *p, *k, *v;
|
||||||
|
|
||||||
|
key = PyList_GetItem(keys, pos);
|
||||||
|
val = PyList_GetItem(vals, pos);
|
||||||
|
if (!key || !val)
|
||||||
|
goto fail_2;
|
||||||
|
|
||||||
if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
|
if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
|
||||||
!PyArg_Parse(val, "s;non-string value in env", &v))
|
!PyArg_Parse(val, "s;non-string value in env", &v))
|
||||||
{
|
{
|
||||||
|
|
@ -926,7 +936,8 @@ posix_execve(self, args)
|
||||||
PyMem_DEL(envlist);
|
PyMem_DEL(envlist);
|
||||||
fail_1:
|
fail_1:
|
||||||
PyMem_DEL(argvlist);
|
PyMem_DEL(argvlist);
|
||||||
|
Py_XDECREF(vals);
|
||||||
|
Py_XDECREF(keys);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_EXECV */
|
#endif /* HAVE_EXECV */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue