Author: Hiroki Date: 2021-08-30T15:14:09+02:00 New Revision: ffcf571107594ff5d02bc2410266efe527787fb0
URL: https://github.com/llvm/llvm-project/commit/ffcf571107594ff5d02bc2410266efe527787fb0 DIFF: https://github.com/llvm/llvm-project/commit/ffcf571107594ff5d02bc2410266efe527787fb0.diff LOG: [LLDB] Fix 'std::out_of_range' crashing bug when file name completion using file path. When I run a lldb command that uses filename completion, if I enter a string that is not only a filename but also a string with a non-file name string added, such as "./" that is relative path string , it will crash as soon as I press the [Tab] key. For example, debugging an executable file named "hello" that is compiled from a file named "hello.c" , and I’ll put a breakpoint on line 3 of hello.c. ``` $ lldb ./hello (lldb) breakpoint set --file hello.c --line 3 ``` This is not a problem, but if I set "--file ./hello." and then press [Tab] key to complete file name, lldb crashes. ``` $ lldb ./hello (lldb) breakpoint set --file ./hello.terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr: __pos (which is 8) > this->size() (which is 7) ``` The crash was caused because substr() (in lldb/source/Host/common/Editline.cpp) cut out string which size is user's input string from the completion string. I modified the code that erase the user's intput string from current line and then add the completion string. Differential Revision: https://reviews.llvm.org/D108817 Added: lldb/test/API/iohandler/completion/Makefile Modified: lldb/source/Host/common/Editline.cpp lldb/test/API/iohandler/completion/TestIOHandlerCompletion.py Removed: ################################################################################ diff --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp index a5598c387b8c7..bcc174325195a 100644 --- a/lldb/source/Host/common/Editline.cpp +++ b/lldb/source/Host/common/Editline.cpp @@ -1006,11 +1006,11 @@ unsigned char Editline::TabCommand(int ch) { switch (completion.GetMode()) { case CompletionMode::Normal: { std::string to_add = completion.GetCompletion(); - to_add = to_add.substr(request.GetCursorArgumentPrefix().size()); // Terminate the current argument with a quote if it started with a quote. if (!request.GetParsedLine().empty() && request.GetParsedArg().IsQuoted()) to_add.push_back(request.GetParsedArg().GetQuoteChar()); to_add.push_back(' '); + el_deletestr(m_editline, request.GetCursorArgumentPrefix().size()); el_insertstr(m_editline, to_add.c_str()); // Clear all the autosuggestion parts if the only single space can be completed. if (to_add == " ") diff --git a/lldb/test/API/iohandler/completion/Makefile b/lldb/test/API/iohandler/completion/Makefile new file mode 100644 index 0000000000000..10495940055b6 --- /dev/null +++ b/lldb/test/API/iohandler/completion/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/lldb/test/API/iohandler/completion/TestIOHandlerCompletion.py b/lldb/test/API/iohandler/completion/TestIOHandlerCompletion.py index 2f49b810fb4c2..5d170317e9795 100644 --- a/lldb/test/API/iohandler/completion/TestIOHandlerCompletion.py +++ b/lldb/test/API/iohandler/completion/TestIOHandlerCompletion.py @@ -20,7 +20,8 @@ class IOHandlerCompletionTest(PExpectTest): @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr49408') @skipIf(oslist=["linux"], archs=["arm", "aarch64"]) def test_completion(self): - self.launch(dimensions=(100,500)) + self.build() + self.launch(dimensions=(100,500), executable=self.getBuildArtifact("a.out")) # Start tab completion, go to the next page and then display all with 'a'. self.child.send("\t\ta") @@ -51,6 +52,13 @@ def test_completion(self): self.child.send("\n") self.expect_prompt() + # Complete a file path. + # FIXME: This should complete to './main.c' and not 'main.c' + self.child.send("breakpoint set --file ./main\t") + self.child.expect_exact("main.c") + self.child.send("\n") + self.expect_prompt() + # Start tab completion and abort showing more commands with 'n'. self.child.send("\t") self.child.expect_exact("More (Y/n/a)") _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits