[lldb/Python] Fix the infinitely looping Python prompt bug
authorJonas Devlieghere <jonas@devlieghere.com>
Tue, 16 Jun 2020 18:02:00 +0000 (11:02 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Tue, 16 Jun 2020 18:05:19 +0000 (11:05 -0700)
Executing commands below will get you bombarded by a wall of Python
command prompts (>>> ).

$ echo 'foo' | ./bin/lldb -o script
$ cat /tmp/script
script
print("foo")
$ lldb --source /tmp/script

The issue is that our custom input reader doesn't handle EOF. According
to the Python documentation, file.readline always includes a trailing
newline character unless the file ends with an incomplete line. An empty
string signals EOF. This patch raises an EOFError when that happens.

[1] https://docs.python.org/2/library/stdtypes.html#file.readline

Differential revision: https://reviews.llvm.org/D81898

lldb/source/Interpreter/embedded_interpreter.py
lldb/test/Shell/ScriptInterpreter/Python/eof.test [new file with mode: 0644]

index 8a1195d..9312dbf 100644 (file)
@@ -73,7 +73,12 @@ def get_terminal_size(fd):
 def readfunc_stdio(prompt):
     sys.stdout.write(prompt)
     sys.stdout.flush()
-    return sys.stdin.readline().rstrip()
+    line = sys.stdin.readline()
+    # Readline always includes a trailing newline character unless the file
+    # ends with an incomplete line. An empty line indicates EOF.
+    if not line:
+        raise EOFError
+    return line.rstrip()
 
 
 def run_python_interpreter(local_dict):
diff --git a/lldb/test/Shell/ScriptInterpreter/Python/eof.test b/lldb/test/Shell/ScriptInterpreter/Python/eof.test
new file mode 100644 (file)
index 0000000..d777f24
--- /dev/null
@@ -0,0 +1,6 @@
+RUN: echo 'foo' | %lldb -o script | FileCheck %s
+
+# Check that the python interpreter detects the OF and the prompt is printed
+# exactly once.
+CHECK: >>>
+CHECK-NOT: >>>