diff options
author | Christian Heimes <christian@python.org> | 2022-03-31 15:14:50 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-31 15:14:50 (GMT) |
commit | 44e915028d75f7cef141aa1aada962465a5907d6 (patch) | |
tree | 7413142bf87102c1d8113bb730ac8b929b989eeb | |
parent | 5458b7e39eb41b146c650b76e04ac67213138a82 (diff) | |
download | cpython-44e915028d75f7cef141aa1aada962465a5907d6.zip cpython-44e915028d75f7cef141aa1aada962465a5907d6.tar.gz cpython-44e915028d75f7cef141aa1aada962465a5907d6.tar.bz2 |
bpo-47182: Fix crash by named unicode characters after interpreter reinitialization (GH-32212)
Automerge-Triggered-By: GH:tiran
-rw-r--r-- | Lib/test/test_embed.py | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2022-03-31-15-37-02.bpo-47182.e_4SsC.rst | 2 | ||||
-rw-r--r-- | Objects/unicodeobject.c | 3 |
3 files changed, 10 insertions, 0 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index f0c88de..7e5e4c1 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -343,6 +343,11 @@ class EmbeddingTests(EmbeddingTestsMixin, unittest.TestCase): out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS) + def test_ucnhash_capi_reset(self): + # bpo-47182: unicodeobject.c:ucnhash_capi was not reset on shutdown. + code = "print('\\N{digit nine}')" + out, err = self.run_embedded_interpreter("test_repeated_init_exec", code) + self.assertEqual(out, '9\n' * INIT_LOOPS) class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): maxDiff = 4096 diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-03-31-15-37-02.bpo-47182.e_4SsC.rst b/Misc/NEWS.d/next/Core and Builtins/2022-03-31-15-37-02.bpo-47182.e_4SsC.rst new file mode 100644 index 0000000..08036bc --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-03-31-15-37-02.bpo-47182.e_4SsC.rst @@ -0,0 +1,2 @@ +Fix a crash when using a named unicode character like ``"\N{digit nine}"`` +after the main interpreter has been initialized a second time. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5a1d2c0..2d40963 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -16085,6 +16085,9 @@ _PyUnicode_Fini(PyInterpreterState *interp) if (_Py_IsMainInterpreter(interp)) { // _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini() assert(interned == NULL); + // bpo-47182: force a unicodedata CAPI capsule re-import on + // subsequent initialization of main interpreter. + ucnhash_capi = NULL; } _PyUnicode_FiniEncodings(&state->fs_codec); |