It turns out that modifying the environment strings is not safe.
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.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 2a1efa6..947e169 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -290,19 +290,29 @@
 		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;
-		v = PyString_FromString(p+1);
-		if (v == NULL)
+		k = PyString_FromStringAndSize(*e, (int)(p-*e));
+		if (k == NULL) {
+			PyErr_Clear();
 			continue;
-		*p = '\0';
-		if (PyDict_GetItemString(d, *e) == NULL)
-			(void) PyDict_SetItemString(d, *e, v);
-		*p = '=';
+		}
+		v = PyString_FromString(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);
 	}
 #if defined(PYOS_OS2)