]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-31160: Fix race condition in test_os.PtyTests (GH-19263)
authorVictor Stinner <vstinner@python.org>
Tue, 31 Mar 2020 22:27:18 +0000 (00:27 +0200)
committerGitHub <noreply@github.com>
Tue, 31 Mar 2020 22:27:18 +0000 (00:27 +0200)
bpo-31160, bpo-40094: Wait until the process completes before closing
the PTY to prevent sending SIGHUP to the child process.

Lib/test/test_builtin.py

index 86e5f1dc0246e05a6b6491bee3cf38e5e83d1113..eaada1b50439be330f696261be1ee846ce097801 100644 (file)
@@ -1846,6 +1846,7 @@ class PtyTests(unittest.TestCase):
             os.close(w)
             self.skipTest("pty.fork() raised {}".format(e))
             raise
+
         if pid == 0:
             # Child
             try:
@@ -1859,9 +1860,11 @@ class PtyTests(unittest.TestCase):
             finally:
                 # We don't want to return to unittest...
                 os._exit(0)
+
         # Parent
         os.close(w)
         os.write(fd, terminal_input)
+
         # Get results from the pipe
         with open(r, "r") as rpipe:
             lines = []
@@ -1871,6 +1874,7 @@ class PtyTests(unittest.TestCase):
                     # The other end was closed => the child exited
                     break
                 lines.append(line)
+
         # Check the result was got and corresponds to the user's terminal input
         if len(lines) != 2:
             # Something went wrong, try to get at stderr
@@ -1888,11 +1892,14 @@ class PtyTests(unittest.TestCase):
             child_output = child_output.decode("ascii", "ignore")
             self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
                       % (len(lines), child_output))
-        os.close(fd)
 
-        # Wait until the child process completes
+        # Wait until the child process completes before closing the PTY to
+        # prevent sending SIGHUP to the child process.
         support.wait_process(pid, exitcode=0)
 
+        # Close the PTY
+        os.close(fd)
+
         return lines
 
     def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):