mirror of https://github.com/python/cpython.git
[3.11] gh-111841: Fix os.putenv() and os.unsetenv() with embedded NUL on Windows (GH-111842) (GH-111967)
(cherry picked from commit 0b06d2482d
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
7b55a955bc
commit
cd3e2d3a6c
|
@ -1130,9 +1130,12 @@ def test_putenv_unsetenv(self):
|
|||
def test_putenv_unsetenv_error(self):
|
||||
# Empty variable name is invalid.
|
||||
# "=" and null character are not allowed in a variable name.
|
||||
for name in ('', '=name', 'na=me', 'name=', 'name\0', 'na\0me'):
|
||||
for name in ('', '=name', 'na=me', 'name='):
|
||||
self.assertRaises((OSError, ValueError), os.putenv, name, "value")
|
||||
self.assertRaises((OSError, ValueError), os.unsetenv, name)
|
||||
for name in ('name\0', 'na\0me'):
|
||||
self.assertRaises(ValueError, os.putenv, name, "value")
|
||||
self.assertRaises(ValueError, os.unsetenv, name)
|
||||
|
||||
if sys.platform == "win32":
|
||||
# On Windows, an environment variable string ("name=value" string)
|
||||
|
|
|
@ -1011,20 +1011,20 @@ def test_environ(self):
|
|||
self.assertEqual(type(k), item_type)
|
||||
self.assertEqual(type(v), item_type)
|
||||
|
||||
@unittest.skipUnless(os.name == 'posix', "see bug gh-111841")
|
||||
def test_putenv(self):
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv('FRUIT\0VEGETABLE', 'cabbage')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv(b'FRUIT\0VEGETABLE', b'cabbage')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv('FRUIT', 'orange\0VEGETABLE=cabbage')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv(b'FRUIT', b'orange\0VEGETABLE=cabbage')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv('FRUIT=ORANGE', 'lemon')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv(b'FRUIT=ORANGE', b'lemon')
|
||||
if os.name == 'posix':
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv(b'FRUIT\0VEGETABLE', b'cabbage')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv(b'FRUIT', b'orange\0VEGETABLE=cabbage')
|
||||
with self.assertRaises(ValueError):
|
||||
os.putenv(b'FRUIT=ORANGE', b'lemon')
|
||||
|
||||
@unittest.skipUnless(hasattr(posix, 'getcwd'), 'test needs posix.getcwd()')
|
||||
def test_getcwd_long_pathnames(self):
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix truncating arguments on an embedded null character in :meth:`os.putenv`
|
||||
and :meth:`os.unsetenv` on Windows.
|
|
@ -11102,7 +11102,6 @@ win32_putenv(PyObject *name, PyObject *value)
|
|||
}
|
||||
|
||||
Py_ssize_t size;
|
||||
/* PyUnicode_AsWideCharString() rejects embedded null characters */
|
||||
wchar_t *env = PyUnicode_AsWideCharString(unicode, &size);
|
||||
Py_DECREF(unicode);
|
||||
|
||||
|
@ -11116,6 +11115,12 @@ win32_putenv(PyObject *name, PyObject *value)
|
|||
PyMem_Free(env);
|
||||
return NULL;
|
||||
}
|
||||
if (wcslen(env) != (size_t)size) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"embedded null character");
|
||||
PyMem_Free(env);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* _wputenv() and SetEnvironmentVariableW() update the environment in the
|
||||
Process Environment Block (PEB). _wputenv() also updates CRT 'environ'
|
||||
|
|
Loading…
Reference in New Issue