author | John Beck <John.Beck@Oracle.COM> |
Wed, 26 Apr 2017 13:55:01 -0700 | |
changeset 7953 | d240e0693286 |
permissions | -rw-r--r-- |
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): |