]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-142651: use `NonCallableMock._lock` for thread safety of `call_count` (#142922)
authorKumar Aditya <kumaraditya@python.org>
Tue, 10 Mar 2026 12:11:12 +0000 (17:41 +0530)
committerGitHub <noreply@github.com>
Tue, 10 Mar 2026 12:11:12 +0000 (12:11 +0000)
Lib/unittest/mock.py

index 34fd49bf56fbb6a1e333beec3348add1aa03d857..64a01a0b713c61da2609711ac27bc6ce148bf9fb 100644 (file)
@@ -1184,10 +1184,16 @@ class CallableMixin(Base):
         # handle call_args
         # needs to be set here so assertions on call arguments pass before
         # execution in the case of awaited calls
-        _call = _Call((args, kwargs), two=True)
-        self.call_args = _call
-        self.call_args_list.append(_call)
-        self.call_count = len(self.call_args_list)
+        with NonCallableMock._lock:
+            # Lock is used here so that call_args_list and call_count are
+            # set atomically otherwise it is possible that by the time call_count
+            # is set another thread may have appended to call_args_list.
+            # The rest of this function relies on list.append being atomic and
+            # skips locking.
+            _call = _Call((args, kwargs), two=True)
+            self.call_args = _call
+            self.call_args_list.append(_call)
+            self.call_count = len(self.call_args_list)
 
         # initial stuff for method_calls:
         do_method_calls = self._mock_parent is not None