summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneonene <53406459+neonene@users.noreply.github.com>2024-08-02 13:36:20 (GMT)
committerGitHub <noreply@github.com>2024-08-02 13:36:20 (GMT)
commit9fc1c992d6fcea0b7558c581846eef6bdd811f6c (patch)
tree7269c36ae0434d6db43692d962475beed71d1c2f
parentb5e6fb39a246bf7ee470d58632cdf588bb9d0298 (diff)
downloadcpython-9fc1c992d6fcea0b7558c581846eef6bdd811f6c.zip
cpython-9fc1c992d6fcea0b7558c581846eef6bdd811f6c.tar.gz
cpython-9fc1c992d6fcea0b7558c581846eef6bdd811f6c.tar.bz2
gh-122334: Fix crash when importing ssl after re-initialization (#122481)
* Fix crash when importing ssl after re-initialization
-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*