From 8f0fa6a174995145b95944cd9d93e41fe32704b7 Mon Sep 17 00:00:00 2001
From: Prithviraj Chaudhuri
Date: Sun, 28 Dec 2025 11:57:44 -0500
Subject: [PATCH] gh-142195: Fixed Popen.communicate indefinite loops
(GH-143203)
Changed condition to evaluate if timeout is less than or equals to 0. This is needed for simulated time environments such as Shadow where the time will match exactly on the boundary.
---------
(cherry picked from commit fa9a4254e81c0abcc3345021c45aaf5f788f9ea9)
Co-authored-by: Prithviraj Chaudhuri
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
---
Lib/subprocess.py | 2 +-
.../next/Library/2025-12-27-00-14-56.gh-issue-142195.UgBEo5.rst | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 Misc/NEWS.d/next/Library/2025-12-27-00-14-56.gh-issue-142195.UgBEo5.rst
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 885f0092b53113..3a8c7434d37b1a 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -2143,7 +2143,7 @@ def _communicate(self, input, endtime, orig_timeout):
while selector.get_map():
timeout = self._remaining_time(endtime)
- if timeout is not None and timeout < 0:
+ if timeout is not None and timeout <= 0:
self._check_timeout(endtime, orig_timeout,
stdout, stderr,
skip_check_and_raise=True)
diff --git a/Misc/NEWS.d/next/Library/2025-12-27-00-14-56.gh-issue-142195.UgBEo5.rst b/Misc/NEWS.d/next/Library/2025-12-27-00-14-56.gh-issue-142195.UgBEo5.rst
new file mode 100644
index 00000000000000..b2b1ffe7225bd7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-12-27-00-14-56.gh-issue-142195.UgBEo5.rst
@@ -0,0 +1 @@
+Updated timeout evaluation logic in :mod:`subprocess` to be compatible with deterministic environments like Shadow where time moves exactly as requested.