From 29e431419a0c23340099a9cd8cf23ec9c7788879 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 20 Sep 2021 08:51:32 -0700 Subject: [PATCH] bpo-40413: test_embed tests calling Py_RunMain() multiple times (GH-28466) (GH-28471) Calling Py_InitializeFromConfig()+Py_RunMain() multiple times must not crash. Cleanup also test_get_argc_argv(). (cherry picked from commit 5e2c32e08ed77081cabd9d51f0589f81c1572732) Co-authored-by: Victor Stinner --- Lib/test/test_embed.py | 8 ++++++++ Programs/_testembed.c | 20 ++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index ea470044430..cc59bf4c859 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -308,6 +308,14 @@ def test_run_main(self): self.assertEqual(out.rstrip(), "Py_RunMain(): sys.argv=['-c', 'arg2']") self.assertEqual(err, '') + def test_run_main_loop(self): + # bpo-40413: Calling Py_InitializeFromConfig()+Py_RunMain() multiple + # times must not crash. + nloop = 5 + out, err = self.run_embedded_interpreter("test_run_main_loop") + self.assertEqual(out, "Py_RunMain(): sys.argv=['-c', 'arg2']\n" * nloop) + self.assertEqual(err, '') + class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): maxDiff = 4096 diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 3933b86af11..897ce7f7ae6 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -1617,15 +1617,26 @@ static int test_run_main(void) } +static int test_run_main_loop(void) +{ + // bpo-40413: Calling Py_InitializeFromConfig()+Py_RunMain() multiple + // times must not crash. + for (int i=0; i<5; i++) { + int exitcode = test_run_main(); + if (exitcode != 0) { + return exitcode; + } + } + return 0; +} + + static int test_get_argc_argv(void) { PyConfig config; PyConfig_InitPythonConfig(&config); - wchar_t *argv[] = {L"python3", L"-c", - (L"import sys; " - L"print(f'Py_RunMain(): sys.argv={sys.argv}')"), - L"arg2"}; + wchar_t *argv[] = {L"python3", L"-c", L"pass", L"arg2"}; config_set_argv(&config, Py_ARRAY_LENGTH(argv), argv); config_set_string(&config, &config.program_name, L"./python3"); @@ -1749,6 +1760,7 @@ static struct TestCase TestCases[] = { {"test_init_setpythonhome", test_init_setpythonhome}, {"test_init_warnoptions", test_init_warnoptions}, {"test_run_main", test_run_main}, + {"test_run_main_loop", test_run_main_loop}, {"test_get_argc_argv", test_get_argc_argv}, // Audit