New submission from STINNER Victor <[email protected]>:
subprocess.Popen.send_signal() doesn't check if the process exited since the poll() method has been called for the last time. If the process exit just before os.kill() is called, the signal can be sent to the wrong process if the process identified is recycled. Attached PR simply calls poll() once to reduce the time window when this race condition can occur, but it doesn't fully kill the race condition. -- See also the new "pidfd" API which only landed very recently in the Linux kernel to prevent this issue: * https://lwn.net/Articles/773459/ "Toward race-free process signaling" (this articles describes this issue) * https://lwn.net/Articles/789023/ "New system calls: pidfd_open() and close_range()" * https://kernel-recipes.org/en/2019/talks/pidfds-process-file-descriptors-on-linux/ "pidfds: Process file descriptors on Linux" by Chrisitan Brauner Illumos, OpenBSD, NetBSD and FreeBSD have similar concepts. I don't propose to use pidfd here, but it's just to highlight that it's a real issue and that kernels are evolving to provide more reliable solutions against the kill(pid, sig) race condition ;-) ---------- components: Library (Lib) messages: 355645 nosy: vstinner priority: normal severity: normal status: open title: subprocess.Popen.send_signal() should poll the process versions: Python 3.9 _______________________________________ Python tracker <[email protected]> <https://bugs.python.org/issue38630> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
