diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2023-12-14 12:59:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-14 12:59:33 (GMT) |
commit | d4234937a1de4cc2cb5d54dd2163721d62cf68d6 (patch) | |
tree | aa048fb1db0773665bed031f00f5864eecb80772 /Python/ceval.c | |
parent | 08ff6fa23deb748c141e2f5c1cfdfbc63e2eb287 (diff) | |
download | cpython-d4234937a1de4cc2cb5d54dd2163721d62cf68d6.zip cpython-d4234937a1de4cc2cb5d54dd2163721d62cf68d6.tar.gz cpython-d4234937a1de4cc2cb5d54dd2163721d62cf68d6.tar.bz2 |
[3.11] gh-112716: Fix SystemError when __builtins__ is not a dict (GH-112770) (GH-113105)
It was raised in two cases:
* in the import statement when looking up __import__
* in pickling some builtin type when looking up built-ins iter, getattr, etc.
(cherry picked from commit 1161c14e8c68296fc465cd48970b32be9bee012e)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index bb6bb35..1ce6bbc 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -7153,11 +7153,8 @@ PyObject * _PyEval_GetBuiltin(PyObject *name) { PyThreadState *tstate = _PyThreadState_GET(); - PyObject *attr = PyDict_GetItemWithError(PyEval_GetBuiltins(), name); - if (attr) { - Py_INCREF(attr); - } - else if (!_PyErr_Occurred(tstate)) { + PyObject *attr = PyObject_GetItem(PyEval_GetBuiltins(), name); + if (attr == NULL && _PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { _PyErr_SetObject(tstate, PyExc_AttributeError, name); } return attr; @@ -7407,9 +7404,9 @@ import_name(PyThreadState *tstate, _PyInterpreterFrame *frame, PyObject *import_func, *res; PyObject* stack[5]; - import_func = _PyDict_GetItemWithError(frame->f_builtins, &_Py_ID(__import__)); + import_func = PyObject_GetItem(frame->f_builtins, &_Py_ID(__import__)); if (import_func == NULL) { - if (!_PyErr_Occurred(tstate)) { + if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) { _PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found"); } return NULL; @@ -7417,6 +7414,7 @@ import_name(PyThreadState *tstate, _PyInterpreterFrame *frame, PyObject *locals = frame->f_locals; /* Fast path for not overloaded __import__. */ if (import_func == tstate->interp->import_func) { + Py_DECREF(import_func); int ilevel = _PyLong_AsInt(level); if (ilevel == -1 && _PyErr_Occurred(tstate)) { return NULL; @@ -7430,8 +7428,6 @@ import_name(PyThreadState *tstate, _PyInterpreterFrame *frame, return res; } - Py_INCREF(import_func); - stack[0] = name; stack[1] = frame->f_globals; stack[2] = locals == NULL ? Py_None : locals; |