]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-122334: Fix crash when importing ssl after re-initialization (GH-122481...
authorneonene <53406459+neonene@users.noreply.github.com>
Fri, 2 Aug 2024 13:44:55 +0000 (22:44 +0900)
committerGitHub <noreply@github.com>
Fri, 2 Aug 2024 13:44:55 +0000 (13:44 +0000)
Fix crash when importing ssl after re-initialization

The current METH_FASTCALL|METH_KEYWORDS functions in a non-builtin module can cause segfaults after restarting the main interpreter, invoking _PyArg_UnpackKeywords() with an insufficiently cleared _PyArg_Parser struct.

This patch fixes the invalidation of the static argument parsers.

Lib/test/test_embed.py
Misc/NEWS.d/next/Library/2024-07-30-21-29-30.gh-issue-122334.LeoE1x.rst [new file with mode: 0644]
Python/getargs.c

index bb798ca8a9a22c3d9250d23f2ebf6557f6cc042e..5ce23223a0f97f499df8b838da968a367a9e046c 100644 (file)
@@ -434,6 +434,21 @@ 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')
+        """)
+        out, err = self.run_embedded_interpreter("test_repeated_init_exec", code)
+        self.assertEqual(out, '1\n2\n' * INIT_LOOPS)
+
 
 class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
     maxDiff = 4096
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 (file)
index 0000000..cef801c
--- /dev/null
@@ -0,0 +1 @@
+Fix crash when importing :mod:`ssl` after the main interpreter restarts.
index 02bddf0618e578da6ab902b09f49f081ffebe267..8ca865b53c8d5446a69173b3e3c5625559a71f9b 100644 (file)
@@ -2071,6 +2071,18 @@ parser_clear(struct _PyArg_Parser *parser)
     if (parser->initialized == 1) {
         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->initialized = 0;
 }
 
 static PyObject*