From 2ccee230f83055af67cb34781179b24a4b9ef2f2 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Tue, 8 Dec 2020 14:07:45 -0700 Subject: [PATCH] Fix off-by-one error in ada_fold_name I'm seeing a libstdc++ assertion failure when running GDB's "maint selftest" command when GDB is configured with the following CFLAGS and CXXFLAGS as part of the configure line: CFLAGS='-D_GLIBCXX_DEBUG -g3 -O0' CXXFLAGS='-D_GLIBCXX_DEBUG -g3 -O0' This is what I see when running the self tests: (gdb) maint selftest Running selftest aarch64-analyze-prologue. Running selftest aarch64-process-record. Running selftest arm-record. Running selftest arm_analyze_prologue. Running selftest array_view. Running selftest child_path. Running selftest cli_utils. Running selftest command_structure_invariants. Running selftest copy_bitwise. Running selftest copy_integer_to_size. Running selftest cp_remove_params. Running selftest cp_symbol_name_matches. Running selftest dw2_expand_symtabs_matching. /usr/include/c++/11/string_view:211: constexpr const value_type& std::basic_string_view<_CharT, _Traits>::operator[](std::basic_string_view<_CharT, _Traits>::size_type) const [with _CharT = char; _Traits = std::char_traits; std::basic_string_view<_CharT, _Traits>::const_reference = const char&; std::basic_string_view<_CharT, _Traits>::size_type = long unsigned int]: Assertion '__pos < this->_M_len' failed. Aborted (core dumped) Here's a partial stack trace: #0 0x00007ffff6ef6262 in raise () from /lib64/libc.so.6 #1 0x00007ffff6edf8a4 in abort () from /lib64/libc.so.6 #2 0x00000000004249bf in std::__replacement_assert ( __file=0xef7480 "/usr/include/c++/11/string_view", __line=211, __function=0xef7328 "constexpr const value_type& std::basic_string_view<_CharT, _Traits>::operator[](std::basic_string_view<_CharT, _Traits>::size_type) const [with _CharT = char; _Traits = std::char_traits; std::ba"..., __condition=0xef7311 "__pos < this->_M_len") at /usr/include/c++/11/x86_64-redhat-linux/bits/c++config.h:2624 #3 0x0000000000451737 in std::basic_string_view >::operator[] (this=0x7fffffffc200, __pos=8) at /usr/include/c++/11/string_view:211 #4 0x00000000004329f5 in ada_fold_name (name="function") at /ironwood1/sourceware-git/rawhide-master/bld/../../worktree-master/gdb/ada-lang.c:988 And, looking at frame #4... (top-gdb) up 4 at /ironwood1/sourceware-git/rawhide-master/bld/../../worktree-master/gdb/ada-lang.c:988 988 fold_buffer[i] = tolower (name[i]); (top-gdb) p i $1 = 8 (top-gdb) p name.size() $2 = 8 My patch adjusts the comparison to only copy name.size() characters from the string. I've added a separate statement for NUL character termination of fold_buffer[]. gdb/ChangeLog: * ada-lang.c (ada_fold_name): Fix off-by-one error. --- gdb/ChangeLog | 4 ++++ gdb/ada-lang.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 82bf5c14533..79e84bc4180 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-12-10 Kevin Buettner + + * ada-lang.c (ada_fold_name): Fix off-by-one error. + 2020-12-10 Luis Machado * breakpoint.c (should_be_inserted): Don't output newline. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 3351b95fce1..39546de41bf 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -984,8 +984,9 @@ ada_fold_name (gdb::string_view name) { int i; - for (i = 0; i <= len; i += 1) + for (i = 0; i < len; i += 1) fold_buffer[i] = tolower (name[i]); + fold_buffer[i] = '\0'; } return fold_buffer; -- 2.30.2