From ab44c4a69e142555f47e8855036099ca0a8d7e11 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 6 May 2024 00:27:51 +0300 Subject: [PATCH 1/3] gh-118613: Fix error handling of `_PyEval_GetFrameLocals` in `ceval.c` --- Python/ceval.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Python/ceval.c b/Python/ceval.c index 0d02a9887bef7a..3b604ab0cd5de0 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2496,8 +2496,13 @@ _PyEval_GetFrameLocals(void) if (PyFrameLocalsProxy_Check(locals)) { PyObject* ret = PyDict_New(); + if (ret == NULL) { + Py_DECREF(locals); + return NULL; + } if (PyDict_Update(ret, locals)) { Py_DECREF(ret); + Py_DECREF(locals); return NULL; } Py_DECREF(locals); From 652289d1852fe9a67fed5885ba6f1b54716fc02d Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 6 May 2024 00:33:17 +0300 Subject: [PATCH 2/3] PyDict_Update handling --- Python/ceval.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/ceval.c b/Python/ceval.c index 3b604ab0cd5de0..4d21af299ea650 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2500,7 +2500,7 @@ _PyEval_GetFrameLocals(void) Py_DECREF(locals); return NULL; } - if (PyDict_Update(ret, locals)) { + if (PyDict_Update(ret, locals) < 0) { Py_DECREF(ret); Py_DECREF(locals); return NULL; From d1e1c5d41d6fe5e4b251a4e0f539657361920d22 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Mon, 6 May 2024 00:39:28 +0300 Subject: [PATCH 3/3] Address review --- Python/ceval.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 4d21af299ea650..128e0417a9fd63 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2507,11 +2507,10 @@ _PyEval_GetFrameLocals(void) } Py_DECREF(locals); return ret; - } else if (PyMapping_Check(locals)) { - return locals; } - return NULL; + assert(PyMapping_Check(locals)); + return locals; } PyObject *