diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-11-22 21:01:28 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-11-22 21:01:28 (GMT) |
commit | 60b385e81361f43720b45b750243b39ce420a673 (patch) | |
tree | 98b62a8f3c54f0619e819271bca622e159f67cef /Modules | |
parent | a233df885b15ada37bb04e06aa465e8d4554b228 (diff) | |
download | cpython-60b385e81361f43720b45b750243b39ce420a673.zip cpython-60b385e81361f43720b45b750243b39ce420a673.tar.gz cpython-60b385e81361f43720b45b750243b39ce420a673.tar.bz2 |
Issue #13415: os.unsetenv() doesn't ignore errors anymore.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/posixmodule.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a27ac71..7286445 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6106,6 +6106,12 @@ posix_putenv(PyObject *self, PyObject *args) PyBytes_FromStringAndSize does not count that */ #ifdef MS_WINDOWS len = wcslen(s1) + wcslen(s2) + 2; + if (_MAX_ENV < (len - 1)) { + PyErr_Format(PyExc_ValueError, + "the environment variable is longer than %u characters", + _MAX_ENV); + goto error; + } newstr = PyUnicode_FromUnicode(NULL, (int)len - 1); #else len = PyBytes_GET_SIZE(os1) + PyBytes_GET_SIZE(os2) + 2; @@ -6177,42 +6183,30 @@ Delete an environment variable."); static PyObject * posix_unsetenv(PyObject *self, PyObject *args) { -#ifdef MS_WINDOWS - char *s1; - - if (!PyArg_ParseTuple(args, "s:unsetenv", &s1)) - return NULL; -#else PyObject *os1; char *s1; + int err; if (!PyArg_ParseTuple(args, "O&:unsetenv", PyUnicode_FSConverter, &os1)) return NULL; s1 = PyBytes_AsString(os1); -#endif - 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 * happen after the real unsetenv() call because the * old value was still accessible until then. */ - if (PyDict_DelItem(posix_putenv_garbage, -#ifdef MS_WINDOWS - PyTuple_GET_ITEM(args, 0) -#else - os1 -#endif - )) { + if (PyDict_DelItem(posix_putenv_garbage, os1)) { /* really not much we can do; just leak */ PyErr_Clear(); } -#ifndef MS_WINDOWS Py_DECREF(os1); -#endif Py_RETURN_NONE; } #endif /* unsetenv */ |