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

Serhiy Storchaka webhook-mailer at python.org
Mon Dec 10 05:11:00 EST 2018


https://github.com/python/cpython/commit/6fef0f1a8162e755f3b46677265b7cf052d9b83f
commit: 6fef0f1a8162e755f3b46677265b7cf052d9b83f
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018年12月10日T12:10:56+02:00
summary:
bpo-35445: Do not ignore memory errors when create posix.environ. (GH-11049)
files:
A Misc/NEWS.d/next/Library/2018-12-09-14-35-49.bpo-35445.LjvtsC.rst
M Modules/posixmodule.c
diff --git a/Misc/NEWS.d/next/Library/2018-12-09-14-35-49.bpo-35445.LjvtsC.rst b/Misc/NEWS.d/next/Library/2018-12-09-14-35-49.bpo-35445.LjvtsC.rst
new file mode 100644
index 000000000000..c0ba2b10e1eb
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-12-09-14-35-49.bpo-35445.LjvtsC.rst
@@ -0,0 +1 @@
+Memory errors during creating posix.environ no longer ignored.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 09d724f2f4bf..d05724a50d1c 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -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)
+ e = _wenviron;
+#else
+ e = environ;
+#endif
+ if (e == NULL)
 return d;
- /* This part ignores errors */
- for (e = _wenviron; *e != NULL; e++) {
+ for (; *e != NULL; e++) {
 PyObject *k;
 PyObject *v;
+#ifdef MS_WINDOWS
 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);
- }
 #else
- if (environ == NULL)
- return d;
- /* This part ignores errors */
- for (e = environ; *e != NULL; e++) {
- PyObject *k;
- PyObject *v;
 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_GetItem(d, k) == NULL) {
- if (PyDict_SetItem(d, k, v) != 0)
- PyErr_Clear();
+ 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;
+ }
 }
 Py_DECREF(k);
 Py_DECREF(v);
 }
-#endif
 return d;
 }
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /