Skip to content

Commit c4a359d

Browse files
[3.13] gh-127208: Reject null character in _imp.create_dynamic() (GH-127400) (#127418)
gh-127208: Reject null character in _imp.create_dynamic() (GH-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]>
1 parent 6a06634 commit c4a359d

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

Lib/test/test_import/__init__.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,19 @@ def test_script_shadowing_stdlib_sys_path_modification(self):
11521152
stdout, stderr = popen.communicate()
11531153
self.assertRegex(stdout, expected_error)
11541154

1155+
def test_create_dynamic_null(self):
1156+
with self.assertRaisesRegex(ValueError, 'embedded null character'):
1157+
class Spec:
1158+
name = "a\x00b"
1159+
origin = "abc"
1160+
_imp.create_dynamic(Spec())
1161+
1162+
with self.assertRaisesRegex(ValueError, 'embedded null character'):
1163+
class Spec2:
1164+
name = "abc"
1165+
origin = "a\x00b"
1166+
_imp.create_dynamic(Spec2())
1167+
11551168

11561169
@skip_if_dont_write_bytecode
11571170
class FilePermissionTests(unittest.TestCase):

Python/import.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,12 +1155,14 @@ del_extensions_cache_value(struct extensions_cache_value *value)
11551155
static void *
11561156
hashtable_key_from_2_strings(PyObject *str1, PyObject *str2, const char sep)
11571157
{
1158-
Py_ssize_t str1_len, str2_len;
1159-
const char *str1_data = PyUnicode_AsUTF8AndSize(str1, &str1_len);
1160-
const char *str2_data = PyUnicode_AsUTF8AndSize(str2, &str2_len);
1158+
const char *str1_data = _PyUnicode_AsUTF8NoNUL(str1);
1159+
const char *str2_data = _PyUnicode_AsUTF8NoNUL(str2);
11611160
if (str1_data == NULL || str2_data == NULL) {
11621161
return NULL;
11631162
}
1163+
Py_ssize_t str1_len = strlen(str1_data);
1164+
Py_ssize_t str2_len = strlen(str2_data);
1165+
11641166
/* Make sure sep and the NULL byte won't cause an overflow. */
11651167
assert(SIZE_MAX - str1_len - str2_len > 2);
11661168
size_t size = str1_len + 1 + str2_len + 1;

0 commit comments

Comments
 (0)