Skip to content

Commit 44e9150

Browse files
authored
bpo-47182: Fix crash by named unicode characters after interpreter reinitialization (GH-32212)
Automerge-Triggered-By: GH:tiran
1 parent 5458b7e commit 44e9150

File tree

3 files changed

+10
-0
lines changed

3 files changed

+10
-0
lines changed

Lib/test/test_embed.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,11 @@ def test_finalize_structseq(self):
343343
out, err = self.run_embedded_interpreter("test_repeated_init_exec", code)
344344
self.assertEqual(out, 'Tests passed\n' * INIT_LOOPS)
345345

346+
def test_ucnhash_capi_reset(self):
347+
# bpo-47182: unicodeobject.c:ucnhash_capi was not reset on shutdown.
348+
code = "print('\\N{digit nine}')"
349+
out, err = self.run_embedded_interpreter("test_repeated_init_exec", code)
350+
self.assertEqual(out, '9\n' * INIT_LOOPS)
346351

347352
class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
348353
maxDiff = 4096
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a crash when using a named unicode character like ``"\N{digit nine}"``
2+
after the main interpreter has been initialized a second time.

Objects/unicodeobject.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16085,6 +16085,9 @@ _PyUnicode_Fini(PyInterpreterState *interp)
1608516085
if (_Py_IsMainInterpreter(interp)) {
1608616086
// _PyUnicode_ClearInterned() must be called before _PyUnicode_Fini()
1608716087
assert(interned == NULL);
16088+
// bpo-47182: force a unicodedata CAPI capsule re-import on
16089+
// subsequent initialization of main interpreter.
16090+
ucnhash_capi = NULL;
1608816091
}
1608916092

1609016093
_PyUnicode_FiniEncodings(&state->fs_codec);

0 commit comments

Comments
 (0)