[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