]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117657: Fix data race in `compare_unicode_unicode_threadsafe` (gh-131746)
authorSam Gross <colesbury@gmail.com>
Wed, 26 Mar 2025 13:01:57 +0000 (09:01 -0400)
committerGitHub <noreply@github.com>
Wed, 26 Mar 2025 13:01:57 +0000 (09:01 -0400)
We can't safely check the type of the found key until we incref it or if we know that it's immortal.

Objects/dictobject.c

index 614c12bb250adadcaba6af00d2052f43c3da970b..f302fc55f4b4d8a856de427eeb6b74839b5a6922 100644 (file)
@@ -1412,18 +1412,20 @@ compare_unicode_unicode_threadsafe(PyDictObject *mp, PyDictKeysObject *dk,
 {
     PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix];
     PyObject *startkey = _Py_atomic_load_ptr_relaxed(&ep->me_key);
-    assert(startkey == NULL || PyUnicode_CheckExact(startkey));
     if (startkey == key) {
+        assert(PyUnicode_CheckExact(startkey));
         return 1;
     }
     if (startkey != NULL) {
         if (_Py_IsImmortal(startkey)) {
+            assert(PyUnicode_CheckExact(startkey));
             return unicode_get_hash(startkey) == hash && unicode_eq(startkey, key);
         }
         else {
             if (!_Py_TryIncrefCompare(&ep->me_key, startkey)) {
                 return DKIX_KEY_CHANGED;
             }
+            assert(PyUnicode_CheckExact(startkey));
             if (unicode_get_hash(startkey) == hash && unicode_eq(startkey, key)) {
                 Py_DECREF(startkey);
                 return 1;