From: Victor Stinner Date: Tue, 22 Nov 2011 21:20:13 +0000 (+0100) Subject: Issue #13415: os.unsetenv() doesn't ignore errors anymore. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=53853c3fa960c34359c2721a28fdfae288b6cb0d;p=python Issue #13415: os.unsetenv() doesn't ignore errors anymore. --- diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 6435b61fdb..4e4956e953 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -361,6 +361,15 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol): value = popen.read().strip() self.assertEqual(value, "World") + def test_unset_error(self): + if sys.platform == "win32": + # an environment variable is limited to 32,767 characters + key = 'x' * 50000 + else: + # "=" is not allowed in a variable name + key = 'key=' + self.assertRaises(OSError, os.environ.__delitem__, key) + class WalkTests(unittest.TestCase): """Tests for os.walk().""" diff --git a/Misc/NEWS b/Misc/NEWS index 0f4e04b81c..1a92e2ad95 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -79,6 +79,8 @@ Core and Builtins Library ------- +- Issue #13415: os.unsetenv() doesn't ignore errors anymore. + - Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is raised when the wrapped raw file is non-blocking and the write would block. Previous code assumed that the raw write() would raise BlockingIOError, but diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 1040ec5b40..6555f1f511 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6994,6 +6994,14 @@ posix_putenv(PyObject *self, PyObject *args) /* XXX This can leak memory -- not easy to fix :-( */ len = strlen(s1) + strlen(s2) + 2; +#ifdef MS_WINDOWS + if (_MAX_ENV < (len - 1)) { + PyErr_Format(PyExc_ValueError, + "the environment variable is longer than %u bytes", + _MAX_ENV); + return NULL; + } +#endif /* len includes space for a trailing \0; the size arg to PyString_FromStringAndSize does not count that */ newstr = PyString_FromStringAndSize(NULL, (int)len - 1); @@ -7036,11 +7044,14 @@ static PyObject * posix_unsetenv(PyObject *self, PyObject *args) { char *s1; + int err; if (!PyArg_ParseTuple(args, "s:unsetenv", &s1)) return NULL; - unsetenv(s1); + err = unsetenv(s1); + if (err) + return posix_error(); /* Remove the key from posix_putenv_garbage; * this will cause it to be collected. This has to