summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2022-03-31 15:14:50 (GMT)
committerGitHub <noreply@github.com>2022-03-31 15:14:50 (GMT)
commit44e915028d75f7cef141aa1aada962465a5907d6 (patch)
tree7413142bf87102c1d8113bb730ac8b929b989eeb
parent5458b7e39eb41b146c650b76e04ac67213138a82 (diff)
downloadcpython-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.py5
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-03-31-15-37-02.bpo-47182.e_4SsC.rst2
-rw-r--r--Objects/unicodeobject.c3
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);