]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116664: In _warnings.c, make filters_version access thread-safe (#117374)
authorErlend E. Aasland <erlend@python.org>
Fri, 29 Mar 2024 20:23:28 +0000 (21:23 +0100)
committerGitHub <noreply@github.com>
Fri, 29 Mar 2024 20:23:28 +0000 (21:23 +0100)
- assert that the lock is held in already_warned()
- protect 'filters_version' increment in warnings_filters_mutated_impl()

Python/_warnings.c

index ac3d3cc2d1246bdf93c263ba62843180417be9ed..4c520252aa12a8996ae65ab0635fbc7b90f78c42 100644 (file)
@@ -398,9 +398,9 @@ already_warned(PyInterpreterState *interp, PyObject *registry, PyObject *key,
         return -1;
 
     WarningsState *st = warnings_get_state(interp);
-    if (st == NULL) {
-        return -1;
-    }
+    assert(st != NULL);
+    _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&st->mutex);
+
     PyObject *version_obj;
     if (PyDict_GetItemRef(registry, &_Py_ID(version), &version_obj) < 0) {
         return -1;
@@ -1177,11 +1177,14 @@ warnings_filters_mutated_impl(PyObject *module)
     if (interp == NULL) {
         return NULL;
     }
+
     WarningsState *st = warnings_get_state(interp);
-    if (st == NULL) {
-        return NULL;
-    }
+    assert(st != NULL);
+
+    Py_BEGIN_CRITICAL_SECTION_MUT(&st->mutex);
     st->filters_version++;
+    Py_END_CRITICAL_SECTION();
+
     Py_RETURN_NONE;
 }