From cffad5c6ef9371b26e32556296cea2bfe8358b1a Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Wed, 17 Jul 2024 11:31:28 +0200 Subject: [PATCH] gh-121863: Immortalize names in code objects to avoid crash (GH-121903) --- Lib/test/test_scope.py | 24 ++++++++++++++++++++++++ Objects/codeobject.c | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 6e46dfa96a6..24a366efc6c 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -810,6 +810,30 @@ class ScopeTests(unittest.TestCase): gc_collect() # For PyPy or other GCs. self.assertIsNone(ref()) + def test_multiple_nesting(self): + # Regression test for https://github.com/python/cpython/issues/121863 + class MultiplyNested: + def f1(self): + __arg = 1 + class D: + def g(self, __arg): + return __arg + return D().g(_MultiplyNested__arg=2) + + def f2(self): + __arg = 1 + class D: + def g(self, __arg): + return __arg + return D().g + + inst = MultiplyNested() + with self.assertRaises(TypeError): + inst.f1() + + closure = inst.f2() + with self.assertRaises(TypeError): + closure(_MultiplyNested__arg=2) if __name__ == '__main__': unittest.main() diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 7493280c898..d45ba5ed4a9 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -147,7 +147,7 @@ intern_strings(PyObject *tuple) "non-string found in code slot"); return -1; } - _PyUnicode_InternMortal(interp, &_PyTuple_ITEMS(tuple)[i]); + _PyUnicode_InternImmortal(interp, &_PyTuple_ITEMS(tuple)[i]); } return 0; }