summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_embed.py19
-rw-r--r--Misc/NEWS.d/next/Library/2024-07-30-21-29-30.gh-issue-122334.LeoE1x.rst1
-rw-r--r--Python/getargs.c13
3 files changed, 33 insertions, 0 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index 9602f1a..ab112d6 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -461,6 +461,25 @@ class EmbeddingTests(EmbeddingTestsMixin, unittest.TestCase):
self.assertEqual(result, {})
self.assertEqual(out, '')
+ def test_getargs_reset_static_parser(self):
+ # Test _PyArg_Parser initializations via _PyArg_UnpackKeywords()
+ # https://github.com/python/cpython/issues/122334
+ code = textwrap.dedent("""
+ import _ssl
+ _ssl.txt2obj(txt='1.3')
+ print('1')
+
+ import _queue
+ _queue.SimpleQueue().put_nowait(item=None)
+ print('2')
+
+ import _zoneinfo
+ _zoneinfo.ZoneInfo.clear_cache(only_keys=['Foo/Bar'])
+ print('3')
+ """)
+ out, err = self.run_embedded_interpreter("test_repeated_init_exec", code)
+ self.assertEqual(out, '1\n2\n3\n' * INIT_LOOPS)
+
@unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi")
class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
diff --git a/Misc/NEWS.d/next/Library/2024-07-30-21-29-30.gh-issue-122334.LeoE1x.rst b/Misc/NEWS.d/next/Library/2024-07-30-21-29-30.gh-issue-122334.LeoE1x.rst
new file mode 100644
index 0000000..cef801c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-07-30-21-29-30.gh-issue-122334.LeoE1x.rst
@@ -0,0 +1 @@
+Fix crash when importing :mod:`ssl` after the main interpreter restarts.
diff --git a/Python/getargs.c b/Python/getargs.c
index b96ce3a..ec2eeb15 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -2030,6 +2030,19 @@ parser_clear(struct _PyArg_Parser *parser)
if (parser->is_kwtuple_owned) {
Py_CLEAR(parser->kwtuple);
}
+
+ if (parser->format) {
+ parser->fname = NULL;
+ }
+ else {
+ assert(parser->fname != NULL);
+ }
+ parser->custom_msg = NULL;
+ parser->pos = 0;
+ parser->min = 0;
+ parser->max = 0;
+ parser->is_kwtuple_owned = 0;
+ parser->once.v = 0;
}
static PyObject*