Skip to content

Commit

Permalink
pythongh-127208: Reject null character in _imp.create_dynamic() (pyth…
Browse files Browse the repository at this point in the history
…onGH-127400)

_imp.create_dynamic() now rejects embedded null characters in the
path and in the module name.
(cherry picked from commit b14fdad)

Co-authored-by: Victor Stinner <[email protected]>
  • Loading branch information
vstinner authored and miss-islington committed Nov 29, 2024
1 parent 6a06634 commit 89b4cce
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
13 changes: 13 additions & 0 deletions Lib/test/test_import/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1152,6 +1152,19 @@ def test_script_shadowing_stdlib_sys_path_modification(self):
stdout, stderr = popen.communicate()
self.assertRegex(stdout, expected_error)

def test_create_dynamic_null(self):
with self.assertRaisesRegex(ValueError, 'embedded null character'):
class Spec:
name = "a\x00b"
origin = "abc"
_imp.create_dynamic(Spec())

with self.assertRaisesRegex(ValueError, 'embedded null character'):
class Spec2:
name = "abc"
origin = "a\x00b"
_imp.create_dynamic(Spec2())


@skip_if_dont_write_bytecode
class FilePermissionTests(unittest.TestCase):
Expand Down
8 changes: 5 additions & 3 deletions Python/import.c
Original file line number Diff line number Diff line change
Expand Up @@ -1155,12 +1155,14 @@ del_extensions_cache_value(struct extensions_cache_value *value)
static void *
hashtable_key_from_2_strings(PyObject *str1, PyObject *str2, const char sep)
{
Py_ssize_t str1_len, str2_len;
const char *str1_data = PyUnicode_AsUTF8AndSize(str1, &str1_len);
const char *str2_data = PyUnicode_AsUTF8AndSize(str2, &str2_len);
const char *str1_data = _PyUnicode_AsUTF8NoNUL(str1);
const char *str2_data = _PyUnicode_AsUTF8NoNUL(str2);
if (str1_data == NULL || str2_data == NULL) {
return NULL;
}
Py_ssize_t str1_len = strlen(str1_data);
Py_ssize_t str2_len = strlen(str2_data);

/* Make sure sep and the NULL byte won't cause an overflow. */
assert(SIZE_MAX - str1_len - str2_len > 2);
size_t size = str1_len + 1 + str2_len + 1;
Expand Down

0 comments on commit 89b4cce

Please sign in to comment.