Skip to content

Commit

Permalink
[3.12] gh-122334: Fix crash when importing ssl after re-initialization (
Browse files Browse the repository at this point in the history
GH-122481) (#122495)

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.
  • Loading branch information
neonene authored Aug 2, 2024
1 parent 372df19 commit 6b8a9a1
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
15 changes: 15 additions & 0 deletions Lib/test/test_embed.py
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,21 @@ def add(cls, slot, own):
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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix crash when importing :mod:`ssl` after the main interpreter restarts.
12 changes: 12 additions & 0 deletions Python/getargs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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*
Expand Down

0 comments on commit 6b8a9a1

Please sign in to comment.