components/python/python27/patches/30-pty.patch
author John Beck <John.Beck@Oracle.COM>
Wed, 26 Apr 2017 13:55:01 -0700
changeset 7953 d240e0693286
permissions -rw-r--r--
25954183 Python pty.spawn is getting stuck
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7953
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     1
This patch comes from upstream: http://bugs.python.org/issue26228
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     2
It has not yet been committed, but seems on track to be, and we need
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     3
it to fix a bug.
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     4
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     5
--- Python-2.7.13/Lib/pty.py.orig	2016-12-17 12:05:06.000000000 -0800
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     6
+++ Python-2.7.13/Lib/pty.py	2017-04-26 13:34:02.125867738 -0700
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     7
@@ -148,7 +148,7 @@
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     8
         if master_fd in rfds:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
     9
             data = master_read(master_fd)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    10
             if not data:  # Reached EOF.
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    11
-                fds.remove(master_fd)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    12
+                return
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    13
             else:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    14
                 os.write(STDOUT_FILENO, data)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    15
         if STDIN_FILENO in rfds:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    16
@@ -164,7 +164,15 @@
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    17
         argv = (argv,)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    18
     pid, master_fd = fork()
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    19
     if pid == CHILD:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    20
-        os.execlp(argv[0], *argv)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    21
+        try:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    22
+            os.execlp(argv[0], *argv)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    23
+        except:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    24
+            # If we wanted to be really clever, we would use
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    25
+            # the same method as subprocess() to pass the error
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    26
+            # back to the parent.  For now just dump stack trace.
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    27
+            traceback.print_exc()
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    28
+        finally:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    29
+            os._exit(1)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    30
     try:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    31
         mode = tty.tcgetattr(STDIN_FILENO)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    32
         tty.setraw(STDIN_FILENO)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    33
@@ -174,6 +182,10 @@
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    34
     try:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    35
         _copy(master_fd, master_read, stdin_read)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    36
     except (IOError, OSError):
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    37
+        # Some OSes never return an EOF on pty, just raise
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    38
+        # an error instead.
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    39
+        pass
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    40
+    finally:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    41
         if restore:
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    42
             tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    43
 
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    44
--- Python-2.7.13/Lib/test/test_pty.py.orig	2016-12-17 12:05:06.000000000 +0000
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    45
+++ Python-2.7.13/Lib/test/test_pty.py	2017-04-26 13:39:11.397817862 +0000
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    46
@@ -270,7 +270,7 @@
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    47
         socketpair[1].close()
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    48
         os.close(write_to_stdin_fd)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    49
 
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    50
-        # Expect two select calls, the last one will cause IndexError
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    51
+        # Expect two select calls, then a normal return on master EOF
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    52
         pty.select = self._mock_select
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    53
         self.select_rfds_lengths.append(2)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    54
         self.select_rfds_results.append([mock_stdin_fd, masters[0]])
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    55
@@ -278,8 +278,7 @@
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    56
         # both encountered an EOF before the second select call.
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    57
         self.select_rfds_lengths.append(0)
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    58
 
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    59
-        with self.assertRaises(IndexError):
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    60
-            pty._copy(masters[0])
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    61
+        pty._copy(masters[0])
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    62
 
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    63
 
d240e0693286 25954183 Python pty.spawn is getting stuck
John Beck <John.Beck@Oracle.COM>
parents:
diff changeset
    64
 def test_main(verbose=None):