]> granicus.if.org Git - python/commitdiff
[Patch #783050 from Patrick Lynch] The emulation of forkpty() is incorrect;
authorGeorg Brandl <georg@python.org>
Wed, 31 Jan 2007 07:48:49 +0000 (07:48 +0000)
committerGeorg Brandl <georg@python.org>
Wed, 31 Jan 2007 07:48:49 +0000 (07:48 +0000)
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.  (<crossing fingers for the buildbots>)

Backport from trunk rev. 53146.

Lib/pty.py
Lib/test/test_pty.py
Misc/NEWS

index 889113c3dd57b975b493b7ee02323687edac38cf..9fd47094272a8c1f831adeabfea5dc6617dbeb2d 100644 (file)
@@ -121,6 +121,8 @@ 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
index 59e51627ddce24c4cb5687380ea654be38a0b042..02290be71b98ddfbdad4beea28b7c04be753d8ce 100644 (file)
@@ -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 False and 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.
index 6036a2daadccd42738f1c76dca531c335bba5b59..ff8a0825cd15ad3c09d6bafad04123aaafa5c643 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -154,6 +154,9 @@ Extension Modules
 Library
 -------
 
+- Patch #783050: the pty.fork() function now closes the slave fd
+  correctly.
+
 - Patch #1638243: the compiler package is now able to correctly compile
   a with statement; previously, executing code containing a with statement
   compiled by the compiler package crashed the interpreter.