diff --git a/Misc/NEWS.d/next/Library/2026-10-19-20-38-17.gh-issue-159739.5a6e94.rst b/Misc/NEWS.d/next/Library/2026-10-19-20-38-17.gh-issue-159739.5a6e94.rst new file mode 100644 index 00000000000000..e7eac98810cf48 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-10-19-20-38-17.gh-issue-159739.5a6e94.rst @@ -0,0 +1,2 @@ +Avoid a crash when memory allocation fails while creating a +:class:`collections.OrderedDict` items iterator. diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 6f10c4863856d9..247cee98a16f10 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1941,22 +1941,21 @@ odictiter_new(PyODictObject *od, int kind) odictiterobject *di; _ODictNode *node; int reversed = kind & _odict_ITER_REVERSED; - - di = PyObject_GC_New(odictiterobject, &PyODictIter_Type); - if (di == NULL) - return NULL; + PyObject *result = NULL; if ((kind & _odict_ITER_ITEMS) == _odict_ITER_ITEMS) { - di->di_result = _PyTuple_FromPairSteal(Py_None, Py_None); - if (di->di_result == NULL) { - Py_DECREF(di); + result = _PyTuple_FromPairSteal(Py_None, Py_None); + if (result == NULL) { return NULL; } } - else { - di->di_result = NULL; + di = PyObject_GC_New(odictiterobject, &PyODictIter_Type); + if (di == NULL) { + Py_XDECREF(result); + return NULL; } + di->di_result = result; di->kind = kind; node = reversed ? _odict_LAST(od) : _odict_FIRST(od); di->di_current = node ? Py_NewRef(_odictnode_KEY(node)) : NULL;