From 5e2fbdc28564c5c7178b3f529b5056bfa0350019 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Tue, 7 Jul 2026 11:25:30 +0300 Subject: [PATCH] gh-153210: Fix `array` module import crash under a memory pressure (GH-153238) (cherry picked from commit 12ed8b16feb3502cea427ff846e9d0b3d7fef721) Co-authored-by: sobolevn --- Lib/test/test_array.py | 19 ++++++++++++++++++- ...-07-07-02-26-43.gh-issue-153210.LUXIcm.rst | 1 + Modules/arraymodule.c | 7 ------- 3 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-07-07-02-26-43.gh-issue-153210.LUXIcm.rst diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 98def945b7d1ccf..788095e5dfa0261 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -5,7 +5,7 @@ import collections.abc import unittest from test import support -from test.support import import_helper +from test.support import import_helper, script_helper from test.support import os_helper from test.support import _2G from test.support import subTests @@ -45,6 +45,23 @@ def test_bad_constructor(self): self.assertRaises(TypeError, array.array, 'xx') self.assertRaises(ValueError, array.array, 'x') + @support.cpython_only + def test_does_not_crash_on_broken_imports(self): + # gh-153210 + code = """if 1: + import collections.abc + + del collections.abc.MutableSequence + + try: + import array # it used to crash before + except AttributeError: + pass + else: + raise AssertionError('AttributeError was not raised') + """ + script_helper.assert_python_ok('-c', code) + @support.cpython_only def test_disallow_instantiation(self): my_array = array.array("I") diff --git a/Misc/NEWS.d/next/Library/2026-07-07-02-26-43.gh-issue-153210.LUXIcm.rst b/Misc/NEWS.d/next/Library/2026-07-07-02-26-43.gh-issue-153210.LUXIcm.rst new file mode 100644 index 000000000000000..d5d4b7c1b8c0ed4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-07-07-02-26-43.gh-issue-153210.LUXIcm.rst @@ -0,0 +1 @@ +Fix crash on :mod:`array` import under a memory pressure. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 6337355f787a76c..c4863b143dfdad2 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -3295,22 +3295,15 @@ array_modexec(PyObject *m) CREATE_TYPE(m, state->ArrayIterType, &arrayiter_spec); Py_SET_TYPE(state->ArrayIterType, &PyType_Type); - if (PyModule_AddObjectRef(m, "ArrayType", - (PyObject *)state->ArrayType) < 0) { - return -1; - } - PyObject *mutablesequence = PyImport_ImportModuleAttrString( "collections.abc", "MutableSequence"); if (!mutablesequence) { - Py_DECREF((PyObject *)state->ArrayType); return -1; } PyObject *res = PyObject_CallMethod(mutablesequence, "register", "O", (PyObject *)state->ArrayType); Py_DECREF(mutablesequence); if (!res) { - Py_DECREF((PyObject *)state->ArrayType); return -1; } Py_DECREF(res);