]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
It turns out that modifying the environment strings is not safe.
authorGuido van Rossum <guido@python.org>
Tue, 3 Aug 1999 19:41:10 +0000 (19:41 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 3 Aug 1999 19:41:10 +0000 (19:41 +0000)
Treat them as read-only, and make a copy as appropriately.  This was
first reported by Bill Janssend and later by Craig Rowland and Ron
Sedlmeyer.  This fix is mine.

Modules/posixmodule.c

index 2a1efa63a909e219fb1effae4e66b62235f56f24..947e1691eb6a66034a27482a2dc36efce81aec0b 100644 (file)
@@ -290,19 +290,29 @@ convertenviron()
                return NULL;
        if (environ == NULL)
                return d;
-       /* XXX This part ignores errors */
+       /* This part ignores errors */
        for (e = environ; *e != NULL; e++) {
+               PyObject *k;
                PyObject *v;
                char *p = strchr(*e, '=');
                if (p == NULL)
                        continue;
+               k = PyString_FromStringAndSize(*e, (int)(p-*e));
+               if (k == NULL) {
+                       PyErr_Clear();
+                       continue;
+               }
                v = PyString_FromString(p+1);
-               if (v == NULL)
+               if (v == NULL) {
+                       PyErr_Clear();
+                       Py_DECREF(k);
                        continue;
-               *p = '\0';
-               if (PyDict_GetItemString(d, *e) == NULL)
-                       (void) PyDict_SetItemString(d, *e, v);
-               *p = '=';
+               }
+               if (PyDict_GetItem(d, k) == NULL) {
+                       if (PyDict_SetItem(d, k, v) != 0)
+                               PyErr_Clear();
+               }
+               Py_DECREF(k);
                Py_DECREF(v);
        }
 #if defined(PYOS_OS2)