From: Andrew M. Kuchling Date: Fri, 22 Dec 2006 18:41:42 +0000 (+0000) Subject: [Patch #783050 from Patrick Lynch] The emulation of forkpty() is incorrect; X-Git-Tag: v2.6a1~2336 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee0e6d16b371a66e1d9ab8103fb51117db37cdbc;p=python [Patch #783050 from Patrick Lynch] The emulation of forkpty() is incorrect; the master should close the slave fd. Added a test to test_pty.py that reads from the master_fd after doing a pty.fork(); without the fix it hangs forever instead of raising an exception. () 2.5 backport candidate. --- diff --git a/Lib/pty.py b/Lib/pty.py index 889113c3dd..d3eb64f0a0 100644 --- a/Lib/pty.py +++ b/Lib/pty.py @@ -121,7 +121,9 @@ def fork(): # Explicitly open the tty to make it become a controlling tty. tmp_fd = os.open(os.ttyname(STDOUT_FILENO), os.O_RDWR) os.close(tmp_fd) - + else: + os.close(slave_fd) + # Parent and child process. return pid, master_fd diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 59e51627dd..fd346c0156 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -115,6 +115,12 @@ if pid == pty.CHILD: os._exit(4) else: debug("Waiting for child (%d) to finish."%pid) + line = os.read(master_fd, 80) + lines = line.replace('\r\n', '\n').split('\n') + if lines != ['In child, calling os.setsid()', + 'Good: OSError was raised.', '']: + raise TestFailed("Unexpected output from child: %r" % line) + (pid, status) = os.waitpid(pid, 0) res = status >> 8 debug("Child (%d) exited with status %d (%d)."%(pid, res, status)) @@ -127,6 +133,15 @@ else: elif res != 4: raise TestFailed, "pty.fork() failed for unknown reasons." + debug("Reading from master_fd now that the child has exited") + try: + s1 = os.read(master_fd, 1024) + except os.error: + pass + else: + raise TestFailed("Read from master_fd did not raise exception") + + os.close(master_fd) # pty.fork() passed.