From: Sam Gross Date: Sat, 14 Sep 2024 18:29:55 +0000 (-0400) Subject: gh-121459: Add missing return to _PyDict_LoadGlobalStackRef (#124085) X-Git-Tag: v3.14.0a1~471 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=401fff7423ca3c8bf1d02e594edfd1412616a559;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 006bc593c2a7..db21961bad26 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;