diff options
author | Pedro Alves <palves@redhat.com> | 2017-07-20 17:58:17 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2017-07-20 17:58:17 +0100 |
commit | cf3252992378872212eeaaca090fe3b1491bcd3f (patch) | |
tree | e7e34bc2d4e20b89ecc2e0877cc01ff96a81b1df | |
parent | 62d2a18a2e4bdb3c278ecda54c8317f179375d28 (diff) | |
download | gdb-cf3252992378872212eeaaca090fe3b1491bcd3f.zip gdb-cf3252992378872212eeaaca090fe3b1491bcd3f.tar.gz gdb-cf3252992378872212eeaaca090fe3b1491bcd3f.tar.bz2 |
Fix cp_find_first_component_aux bug
Valgrind catches an out-of-bounds read here:
$ gdb ./testsuite/outputs/gdb.cp/method2/method2
(gdb) start
[...]
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffd958) at src/gdb/testsuite/gdb.cp/method2.cc:26
26 return 0;
(gdb) b A::operator
==26907== Invalid read of size 1
==26907== at 0x75C0AE: cp_find_first_component_aux(char const*, int) (cp-support.c:951)
==26907== by 0x75C084: cp_find_first_component(char const*) (cp-support.c:925)
==26907== by 0x75C3DA: cp_entire_prefix_len(char const*) (cp-support.c:1089)
==26907== by 0x758B16: cp_lookup_symbol_in_namespace(char const*, char const*, block const*, domain_enum_tag, int) (cp-namespace.c:314)
==26907== by 0x75972A: lookup_namespace_scope(language_defn const*, char const*, block const*, domain_enum_tag, char const*, int) (cp-namespace.c:739)
==26907== by 0x7597CB: cp_lookup_symbol_nonlocal(language_defn const*, char const*, block const*, domain_enum_tag) (cp-namespace.c:768)
==26907== by 0x8C1137: lookup_symbol_aux(char const*, block const*, domain_enum_tag, language, field_of_this_result*) (symtab.c:2016)
==26907== by 0x8C098A: lookup_symbol_in_language(char const*, block const*, domain_enum_tag, language, field_of_this_result*) (symtab.c:1824)
==26907== by 0x8C0A04: lookup_symbol(char const*, block const*, domain_enum_tag, field_of_this_result*) (symtab.c:1836)
==26907== by 0x82CBE1: find_label_symbols(linespec_state*, VEC_symbolp*, VEC_symbolp**, char const*) (linespec.c:3390)
==26907== by 0x828FB5: linespec_parse_basic(ls_parser*) (linespec.c:1620)
==26907== by 0x82A78F: parse_linespec(ls_parser*, char const*) (linespec.c:2307)
==26907== Address 0x910f97c is 0 bytes after a block of size 12 alloc'd
==26907== at 0x4C28BF6: malloc (vg_replace_malloc.c:299)
==26907== by 0x74E737: xmalloc (common-utils.c:43)
==26907== by 0x74EAF4: savestring(char const*, unsigned long) (common-utils.c:179)
==26907== by 0x826CEF: copy_token_string(ls_token) (linespec.c:488)
==26907== by 0x828EF6: linespec_parse_basic(ls_parser*) (linespec.c:1599)
==26907== by 0x82A78F: parse_linespec(ls_parser*, char const*) (linespec.c:2307)
==26907== by 0x82AE27: event_location_to_sals(ls_parser*, event_location const*) (linespec.c:2469)
==26907== by 0x82B1CE: decode_line_full(event_location const*, int, program_space*, symtab*, int, linespec_result*, char const*, char const*) (linespec.c:2557)
==26907== by 0x720C8A: parse_breakpoint_sals(event_location const*, linespec_result*) (breakpoint.c:9550)
==26907== by 0x72A2F7: create_sals_from_location_default(event_location const*, linespec_result*, bptype) (breakpoint.c:14484)
==26907== by 0x727F86: bkpt_create_sals_from_location(event_location const*, linespec_result*, bptype) (breakpoint.c:13219)
==26907== by 0x72146D: create_breakpoint(gdbarch*, event_location const*, char*, int, char*, int, int, bptype, int, auto_boolean, breakpoint_ops const*, int, int, int, unsigned int) (breakpoint.c:9759)
Tests exercising this will be added further down the series.
gdb/ChangeLog:
2017-07-20 Pedro Alves <palves@redhat.com>
* cp-support.c (cp_find_first_component_aux): Add missing case for
end of string.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/cp-support.c | 2 |
2 files changed, 7 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc6e55b..41e01cd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-07-20 Pedro Alves <palves@redhat.com> + + * cp-support.c (cp_find_first_component_aux): Add missing case for + end of string. + 2017-07-18 David Blaikie <dblaikie@gmail.com> * dwarf2read.c (create_cus_hash_table): Re-add lost initialization diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 122fadd..df9a563 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -1009,6 +1009,8 @@ cp_find_first_component_aux (const char *name, int permissive) ++index; switch (name[index]) { + case '\0': + return index; /* Skip over one less than the appropriate number of characters: the for loop will skip over the last one. */ |