diff options
author | Pavel Labath <labath@google.com> | 2017-05-05 11:51:21 +0000 |
---|---|---|
committer | Pavel Labath <labath@google.com> | 2017-05-05 11:51:21 +0000 |
commit | 38c2059aec111174bcdc06c8006d998c513c8b8c (patch) | |
tree | f1d168b7952aadc8ed2490bf271f8ad4cf8b28fb /lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py | |
parent | 1b74f8c51f7fb44d47336f7431b427326230d47e (diff) | |
download | bcm5719-llvm-38c2059aec111174bcdc06c8006d998c513c8b8c.tar.gz bcm5719-llvm-38c2059aec111174bcdc06c8006d998c513c8b8c.zip |
Fix segfault resulting from empty print prompt
Summary:
I have found a way to segfault lldb in 7 keystrokes! Steps to reproduce:
1) Launch lldb
2) Type `print` and hit enter. lldb will now prompt you to type a list of
expressions, followed by an empty line.
3) Hit enter, indicating the end of your input.
4) Segfault!
After some investigation, I've found the issue in Host/common/Editline.cpp.
Editline::MoveCursor() relies on m_input_lines not being empty when the `to`
argument is CursorPosition::BlockEnd. This scenario, as far as I can tell,
occurs in one specific instance: In Editline::EndOrAddLineCommand() when the
list of lines being processed contains exactly one string (""). Meeting this
condition is fairly simple, I have posted steps to reproduce above.
Reviewers: krytarowski, zturner, labath
Reviewed By: labath
Subscribers: scott.smith, lldb-commits
Differential Revision: https://reviews.llvm.org/D32421
Patch by Alex Langford.
llvm-svn: 302225
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py')
-rw-r--r-- | lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py b/lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py index b1b5cbe677c..aa369ebeff8 100644 --- a/lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py +++ b/lldb/packages/Python/lldbsuite/test/expression_command/multiline/TestMultilineExpressions.py @@ -12,6 +12,7 @@ from lldbsuite.test import lldbutil class MultilineExpressionsTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) + NO_DEBUG_INFO_TESTCASE = True def setUp(self): # Call super's setUp(). @@ -60,3 +61,30 @@ class MultilineExpressionsTestCase(TestBase): child.expect_exact(prompt) self.expect(child.before, exe=False, patterns=['= 5']) + + @skipIfRemote + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr22274: need a pexpect replacement for windows") + def test_empty_list(self): + """Test printing an empty list of expressions""" + import pexpect + prompt = "(lldb) " + + # So that the child gets torn down after the test + self.child = pexpect.spawn( + "%s %s" % + (lldbtest_config.lldbExec, self.lldbOption)) + child = self.child + + # Turn on logging for what the child sends back. + if self.TraceOn(): + child.logfile_read = sys.stdout + + # We expect a prompt, then send "print" to start a list of expressions, + # then an empty line. We expect a prompt back. + child.expect_exact(prompt) + child.sendline("print") + child.expect_exact('1:') + child.sendline("") + child.expect_exact(prompt) |