]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-121459: Add missing return to _PyDict_LoadGlobalStackRef (#124085)
authorSam Gross <colesbury@gmail.com>
Sat, 14 Sep 2024 18:29:55 +0000 (14:29 -0400)
committerGitHub <noreply@github.com>
Sat, 14 Sep 2024 18:29:55 +0000 (14:29 -0400)
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.

Objects/dictobject.c

index 006bc593c2a75464ef306dd55db653130ef17466..db21961bad266bc7dc09f76e6b181014f98751e7 100644 (file)
@@ -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;