diff options
author | Sam Gross <colesbury@gmail.com> | 2024-09-14 18:29:55 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-14 18:29:55 (GMT) |
commit | 401fff7423ca3c8bf1d02e594edfd1412616a559 (patch) | |
tree | b2f460a0735c2b01284027c1decc567916bc856c /Objects | |
parent | 9dacf430c2f4af2acd870291a649b7b957efcd2c (diff) | |
download | cpython-401fff7423ca3c8bf1d02e594edfd1412616a559.zip cpython-401fff7423ca3c8bf1d02e594edfd1412616a559.tar.gz cpython-401fff7423ca3c8bf1d02e594edfd1412616a559.tar.bz2 |
gh-121459: Add missing return to _PyDict_LoadGlobalStackRef (#124085)
We need to return immediately if there's an error during dictionary
lookup.
Also avoid the conditional-if operator. MSVC versions through v19.27 miscompile
compound literals with side effects within a conditional operator. This caused
crashes in the Windows10 buildbot.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/dictobject.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 006bc59..db21961 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1550,7 +1550,12 @@ _Py_dict_lookup_threadsafe_stackref(PyDictObject *mp, PyObject *key, Py_hash_t h { PyObject *val; Py_ssize_t ix = _Py_dict_lookup(mp, key, hash, &val); - *value_addr = val == NULL ? PyStackRef_NULL : PyStackRef_FromPyObjectNew(val); + if (val == NULL) { + *value_addr = PyStackRef_NULL; + } + else { + *value_addr = PyStackRef_FromPyObjectNew(val); + } return ix; } @@ -2483,7 +2488,7 @@ _PyDict_LoadGlobalStackRef(PyDictObject *globals, PyDictObject *builtins, PyObje /* namespace 1: globals */ ix = _Py_dict_lookup_threadsafe_stackref(globals, key, hash, res); if (ix == DKIX_ERROR) { - *res = PyStackRef_NULL; + return; } if (ix != DKIX_EMPTY && !PyStackRef_IsNull(*res)) { return; |