From: Eric Snow Date: Thu, 8 Sep 2016 02:08:02 +0000 (-0700) Subject: Issue #15578: Correctly incref the parent module while importing. X-Git-Tag: v2.7.13rc1~161 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bf00bc783fd87544c1717b2db163736cea6412aa;p=python Issue #15578: Correctly incref the parent module while importing. --- diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index c17da10011..2abf5b2940 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -397,6 +397,24 @@ class ImportTests(unittest.TestCase): finally: sys.path.pop(0) + def test_replace_parent_in_sys_modules(self): + dir_name = os.path.abspath(TESTFN) + os.mkdir(dir_name) + try: + pkg_dir = os.path.join(dir_name, 'sa') + os.mkdir(pkg_dir) + with open(os.path.join(pkg_dir, '__init__.py'), 'w') as init_file: + init_file.write("import v1") + with open(os.path.join(pkg_dir, 'v1.py'), 'w') as v1_file: + v1_file.write("import sys;" + "sys.modules['sa'] = sys.modules[__name__];" + "import sa") + sys.path.insert(0, dir_name) + # a segfault means the test failed! + import sa + finally: + rmtree(dir_name) + class PycRewritingTests(unittest.TestCase): # Test that the `co_filename` attribute on code objects always points diff --git a/Misc/NEWS b/Misc/NEWS index 8e235868df..b4538424e2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -7082,6 +7082,8 @@ Core and Builtins - Add Py3k warnings for parameter names in parentheses. +- Issue #15578: Correctly incref the parent module while importing. + - Issue #7362: Give a proper error message for ``def f((x)=3): pass``. - Issue #7085: Fix crash when importing some extensions in a thread on MacOSX diff --git a/Python/import.c b/Python/import.c index 96f7d47544..af47b0bdb4 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2243,8 +2243,10 @@ import_module_level(char *name, PyObject *globals, PyObject *locals, if (parent == NULL) goto error_exit; + Py_INCREF(parent); head = load_next(parent, level < 0 ? Py_None : parent, &name, buf, &buflen); + Py_DECREF(parent); if (head == NULL) goto error_exit;