bpo-35445: Do not ignore memory errors when create posix.environ. (GH-11049)

This commit is contained in:
Serhiy Storchaka 2018-12-10 12:10:56 +02:00 committed by GitHub
parent 72ff7b4c00
commit 6fef0f1a81
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 38 deletions

View File

@ -0,0 +1 @@
Memory errors during creating posix.environ no longer ignored.

View File

@ -1356,62 +1356,52 @@ convertenviron(void)
/* _wenviron must be initialized in this way if the program is started
through main() instead of wmain(). */
_wgetenv(L"");
if (_wenviron == NULL)
return d;
/* This part ignores errors */
for (e = _wenviron; *e != NULL; e++) {
PyObject *k;
PyObject *v;
const wchar_t *p = wcschr(*e, L'=');
if (p == NULL)
continue;
k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e));
if (k == NULL) {
PyErr_Clear();
continue;
}
v = PyUnicode_FromWideChar(p+1, wcslen(p+1));
if (v == NULL) {
PyErr_Clear();
Py_DECREF(k);
continue;
}
if (PyDict_GetItem(d, k) == NULL) {
if (PyDict_SetItem(d, k, v) != 0)
PyErr_Clear();
}
Py_DECREF(k);
Py_DECREF(v);
}
e = _wenviron;
#else
if (environ == NULL)
e = environ;
#endif
if (e == NULL)
return d;
/* This part ignores errors */
for (e = environ; *e != NULL; e++) {
for (; *e != NULL; e++) {
PyObject *k;
PyObject *v;
#ifdef MS_WINDOWS
const wchar_t *p = wcschr(*e, L'=');
#else
const char *p = strchr(*e, '=');
#endif
if (p == NULL)
continue;
#ifdef MS_WINDOWS
k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e));
#else
k = PyBytes_FromStringAndSize(*e, (int)(p-*e));
#endif
if (k == NULL) {
PyErr_Clear();
continue;
Py_DECREF(d);
return NULL;
}
#ifdef MS_WINDOWS
v = PyUnicode_FromWideChar(p+1, wcslen(p+1));
#else
v = PyBytes_FromStringAndSize(p+1, strlen(p+1));
#endif
if (v == NULL) {
PyErr_Clear();
Py_DECREF(k);
continue;
Py_DECREF(d);
return NULL;
}
if (PyDict_GetItemWithError(d, k) == NULL) {
if (PyErr_Occurred() || PyDict_SetItem(d, k, v) != 0) {
Py_DECREF(v);
Py_DECREF(k);
Py_DECREF(d);
return NULL;
}
if (PyDict_GetItem(d, k) == NULL) {
if (PyDict_SetItem(d, k, v) != 0)
PyErr_Clear();
}
Py_DECREF(k);
Py_DECREF(v);
}
#endif
return d;
}