[Lldb-commits] [lldb] r367308 - [lldb] Fix crash when tab-completing in multi-line expr
Hans Wennborg via lldb-commits
lldb-commits at lists.llvm.org
Thu Aug 1 02:39:28 PDT 2019
Merged to release_90 in r367534.
On Tue, Jul 30, 2019 at 2:53 PM Hans Wennborg <hans at chromium.org> wrote:
>
> Hi Raphael,
>
> Since this just landed, let's have it bake in trunk a little bit, and
> then I'll merge it.
>
> Thanks,
> Hans
>
> On Tue, Jul 30, 2019 at 2:36 PM Raphael “Teemperor” Isemann
> <teemperor at gmail.com> wrote:
> >
> > Hi Hans,
> >
> > Can you cherry-pick this to the 9.0 release? The issue is really easy to hit when using LLDB and the fix is obvious&safe.
> >
> > Thanks!
> > - Raphael
> >
> > > On Jul 30, 2019, at 2:31 PM, Raphael Isemann via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> > >
> > > Author: teemperor
> > > Date: Tue Jul 30 05:31:24 2019
> > > New Revision: 367308
> > >
> > > URL: http://llvm.org/viewvc/llvm-project?rev=367308&view=rev
> > > Log:
> > > [lldb] Fix crash when tab-completing in multi-line expr
> > >
> > > Summary:
> > > Tab completing inside the multiline expression command can cause LLDB to crash. The easiest way
> > > to do this is to go inside a frame with at least one local variable and then try to complete:
> > >
> > > (lldb) expr
> > > 1. a[tab]
> > >
> > > Reason for this was some mixup when we calculate the cursor position. Obviously we should calculate
> > > the offset inside the string by doing 'end - start', but we are doing 'start - end' (which causes the offset to
> > > become -1 which will lead to some out-of-bounds reading).
> > >
> > > Fixes rdar://51754005
> > >
> > > I don't see any way to test this as the *multiline* expression completion is completely untested at the moment
> > > and I don't think we have any existing code for testing infrastructure for it.
> > >
> > > Reviewers: shafik, davide, labath
> > >
> > > Reviewed By: labath
> > >
> > > Subscribers: abidh, lldb-commits, davide, clayborg, labath
> > >
> > > Tags: #lldb
> > >
> > > Differential Revision: https://reviews.llvm.org/D64995
> > >
> > > Added:
> > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/
> > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile
> > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
> > > lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c
> > > Modified:
> > > lldb/trunk/source/Core/IOHandler.cpp
> > >
> > > Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile
> > > URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile?rev=367308&view=auto
> > > ==============================================================================
> > > --- lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile (added)
> > > +++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/Makefile Tue Jul 30 05:31:24 2019
> > > @@ -0,0 +1,3 @@
> > > +LEVEL = ../../make
> > > +C_SOURCES := main.c
> > > +include $(LEVEL)/Makefile.rules
> > >
> > > Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py
> > > URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py?rev=367308&view=auto
> > > ==============================================================================
> > > --- lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py (added)
> > > +++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/TestMultilineCompletion.py Tue Jul 30 05:31:24 2019
> > > @@ -0,0 +1,52 @@
> > > +"""
> > > +Test completion for multiline expressions.
> > > +"""
> > > +
> > > +import lldb
> > > +from lldbsuite.test.decorators import *
> > > +from lldbsuite.test.lldbtest import *
> > > +
> > > +class MultilineCompletionTest(TestBase):
> > > +
> > > + mydir = TestBase.compute_mydir(__file__)
> > > + NO_DEBUG_INFO_TESTCASE = True
> > > +
> > > + def setUp(self):
> > > + TestBase.setUp(self)
> > > + self.source = 'main.c'
> > > +
> > > + def expect_string(self, string):
> > > + import pexpect
> > > + """This expects for "string", with timeout & EOF being test fails."""
> > > + try:
> > > + self.child.expect_exact(string)
> > > + except pexpect.EOF:
> > > + self.fail("Got EOF waiting for '%s'" % (string))
> > > + except pexpect.TIMEOUT:
> > > + self.fail("Timed out waiting for '%s'" % (string))
> > > +
> > > + @expectedFailureAll(
> > > + oslist=["windows"],
> > > + bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
> > > + def test_basic_completion(self):
> > > + """Test that we can complete a simple multiline expression"""
> > > + self.build()
> > > + self.setTearDownCleanup()
> > > +
> > > + import pexpect
> > > + exe = self.getBuildArtifact("a.out")
> > > + prompt = "(lldb) "
> > > +
> > > + run_commands = ' -o "b main" -o "r"'
> > > + self.child = pexpect.spawn(
> > > + '%s %s %s %s' %
> > > + (lldbtest_config.lldbExec, self.lldbOption, run_commands, exe))
> > > + child = self.child
> > > +
> > > + self.expect_string(prompt)
> > > + self.child.sendline("expr")
> > > + self.expect_string("terminate with an empty line to evaluate")
> > > + self.child.send("to_\t")
> > > + self.expect_string("to_complete")
> > > +
> > > + self.deletePexpectChild()
> > >
> > > Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c
> > > URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c?rev=367308&view=auto
> > > ==============================================================================
> > > --- lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c (added)
> > > +++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/multiline-completion/main.c Tue Jul 30 05:31:24 2019
> > > @@ -0,0 +1,5 @@
> > > +int main(int argc, char **argv) {
> > > + lldb_enable_attach();
> > > + int to_complete = 0;
> > > + return to_complete;
> > > +}
> > >
> > > Modified: lldb/trunk/source/Core/IOHandler.cpp
> > > URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/IOHandler.cpp?rev=367308&r1=367307&r2=367308&view=diff
> > > ==============================================================================
> > > --- lldb/trunk/source/Core/IOHandler.cpp (original)
> > > +++ lldb/trunk/source/Core/IOHandler.cpp Tue Jul 30 05:31:24 2019
> > > @@ -233,7 +233,7 @@ int IOHandlerDelegate::IOHandlerComplete
> > > matches, descriptions);
> > > case Completion::Expression: {
> > > CompletionResult result;
> > > - CompletionRequest request(current_line, current_line - cursor,
> > > + CompletionRequest request(current_line, cursor - current_line,
> > > skip_first_n_matches, max_matches, result);
> > > CommandCompletions::InvokeCommonCompletionCallbacks(
> > > io_handler.GetDebugger().GetCommandInterpreter(),
> > >
> > >
> > > _______________________________________________
> > > lldb-commits mailing list
> > > lldb-commits at lists.llvm.org
> > > https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> >
More information about the lldb-commits
mailing list