summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-09-14 18:29:55 (GMT)
committerGitHub <noreply@github.com>2024-09-14 18:29:55 (GMT)
commit401fff7423ca3c8bf1d02e594edfd1412616a559 (patch)
treeb2f460a0735c2b01284027c1decc567916bc856c /Objects
parent9dacf430c2f4af2acd870291a649b7b957efcd2c (diff)
downloadcpython-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.c9
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;