diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 3b9ff672a1aa035..4fc851c0ce464be 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -459,6 +459,18 @@ def test_copy_noncompact(self): d2 = d.copy() self.assertEqual(d2, d) + @support.nomemtest + def test_copy_empty_no_memory(self): + import _testcapi + d = {} + d_copy = d.copy + with self.assertRaises(MemoryError): + try: + _testcapi.set_nomemory(0) + d_copy() + finally: + _testcapi.remove_mem_hooks() + def test_get(self): d = {} self.assertIs(d.get('c'), None) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-10-12-23-32-50.gh-issue-159285.nlLuwQ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-12-23-32-50.gh-issue-159285.nlLuwQ.rst new file mode 100644 index 000000000000000..0cb795f8309f73e --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-10-12-23-32-50.gh-issue-159285.nlLuwQ.rst @@ -0,0 +1,2 @@ +Fix a crash in a debug build when copying an empty :class:`dict` fails with +:exc:`MemoryError`. Patch by Christian Aurich Zanettini Martins. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index e900ef33cc42f53..89b4abd596761cd 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -4448,7 +4448,7 @@ copy_lock_held_untracked(PyObject *o, int as_frozendict) else { d = dict_new_untracked(&PyDict_Type); } - assert(!_PyObject_GC_IS_TRACKED(d)); + assert(d == NULL || !_PyObject_GC_IS_TRACKED(d)); return d; }