aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorKeith Seitz <keiths@redhat.com>2017-12-07 12:59:07 -0800
committerKeith Seitz <keiths@redhat.com>2017-12-07 15:27:35 -0800
commitfa6eb693cf43b427474b1d96ce093f6ea9e5da6a (patch)
tree56d6279c1ee1f7a575a80d3fb025f581759a548b /gdb
parent883fd55ab1049333364479a7f5b0c7e61a310bac (diff)
downloadfsf-binutils-gdb-fa6eb693cf43b427474b1d96ce093f6ea9e5da6a.zip
fsf-binutils-gdb-fa6eb693cf43b427474b1d96ce093f6ea9e5da6a.tar.gz
fsf-binutils-gdb-fa6eb693cf43b427474b1d96ce093f6ea9e5da6a.tar.bz2
Validate explicit locations with early termination
breakpoints/22569 involves an internal error generated by the rather innocent looking command: (gdb) break -source test.cpp main .../linespec.c:3302: internal-error: void decode_line_full(...): Assertion `result.size () == 1 || canonical->pre_expanded' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) The input string is tokenized into "-source", "test.cpp", and "main" (input parsing breaks on whitespace). create_breakpoint is then called with the explicit location (containing only the source file name) and "main" as the extra_string argument. No SaLs are created for this underspecified explicit location, and the "result.size () == 1" evaluates false (as does the pre_expanded condition). This triggers the assertion. Normally string_to_explicit_location validates the input string. However, the presence of the string "main" causes the parser to exit early: 802 else 803 { 804 /* End of the explicit location specification. 805 Stop parsing and return whatever explicit location was 806 parsed. */ 807 *argp = start; 808 return location; 809 } This bypasses the validation that is done a few lines down in this function which would have emitted the expected error. This patch fixes that. Additionally, this patch also fixes an inconsistency with error reporting in this use case: (gdb) b -source foo Source filename requires function, label, or line offset. (gdb) b -source foo main No source file named foo. These two commands should have elicited the same error message. gdb/ChangeLog: PR breakpoints/22569 * location.c (string_to_explicit_location): When terminating parsing early, break out of enclosing loop instead of returning. gdb/testsuite/ChangeLog: PR breakpoints/22569 * gdb.linespec/ls-errs.exp: Change expected result of "break -source this file has spaces.c -line 3". Check that an explicit source file followed by whitespace is identified as an invalid explicit location.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/location.c2
-rw-r--r--gdb/testsuite/ChangeLog8
-rw-r--r--gdb/testsuite/gdb.linespec/ls-errs.exp3
4 files changed, 17 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0347f37..c18160c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2017-12-07 Keith Seitz <keiths@redhat.com>
+ PR breakpoints/22569
+ * location.c (string_to_explicit_location): When terminating
+ parsing early, break out of enclosing loop instead of returning.
+
+2017-12-07 Keith Seitz <keiths@redhat.com>
+
* NEWS (New commands): Mention set/show print type nested-type-limit.
* c-typeprint.c (c_type_print_base): Print out nested types.
* dwarf2read.c (struct typedef_field_list): Rename to ...
diff --git a/gdb/location.c b/gdb/location.c
index 6752462..69b7aa4 100644
--- a/gdb/location.c
+++ b/gdb/location.c
@@ -843,7 +843,7 @@ string_to_explicit_location (const char **argp,
Stop parsing and return whatever explicit location was
parsed. */
*argp = start;
- return location;
+ break;
}
*argp = skip_spaces (*argp);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 53f114a..f8fa687 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,13 @@
2017-12-07 Keith Seitz <keiths@redhat.com>
+ PR breakpoints/22569
+ * gdb.linespec/ls-errs.exp: Change expected result of "break
+ -source this file has spaces.c -line 3".
+ Check that an explicit source file followed by whitespace is
+ identified as an invalid explicit location.
+
+2017-12-07 Keith Seitz <keiths@redhat.com>
+
* gdb.cp/nested-types.cc: New file.
* gdb.cp/nested-types.exp: New file.
* lib/cp-support.exp: Load data-structures.exp library.
diff --git a/gdb/testsuite/gdb.linespec/ls-errs.exp b/gdb/testsuite/gdb.linespec/ls-errs.exp
index ee8bb08..a0bcc52 100644
--- a/gdb/testsuite/gdb.linespec/ls-errs.exp
+++ b/gdb/testsuite/gdb.linespec/ls-errs.exp
@@ -175,7 +175,7 @@ proc do_test {lang} {
# Test that option lexing stops at whitespace boundaries, except
# when lexing function names, where we want to handle setting
# breakpoints on e.g., "int template_function<int>()".
- test_break "-source this file has spaces.c -line 3" invalid_file "this"
+ test_break "-source this file has spaces.c -line 3" source_incomplete
test_break "-function ret_type tmpl_function" \
invalid_function "ret_type tmpl_function"
test_break "-source $srcfile -function ret_type tmpl_function" \
@@ -267,6 +267,7 @@ proc do_test {lang} {
# Explicit linespec-specific tests
test_break "-source $srcfile" source_incomplete
+ test_break "-source $srcfile main" source_incomplete
}
foreach_with_prefix lang {"C" "C++"} {