Blame SOURCES/0007-GDB-fix-completion-related-libstdc-assert.patch

e64a0b
From ce92e458506aec5bc5516a771e26b0f907ce0db4 Mon Sep 17 00:00:00 2001
e64a0b
From: Lianbo Jiang <lijiang@redhat.com>
e64a0b
Date: Wed, 26 Jan 2022 20:32:35 +0800
e64a0b
Subject: [PATCH 07/10] GDB: fix completion related libstdc++ assert
e64a0b
e64a0b
Currently crash built with some specific flags (-D_GLIBCXX_ASSERTIONS
e64a0b
and etc.) may abort and print the following error when running the gdb
e64a0b
list command or tab-completion of symbols.  For example:
e64a0b
e64a0b
  crash> l panic
e64a0b
  /usr/include/c++/11/string_view:234: ...
e64a0b
  Aborted (core dumped)
e64a0b
e64a0b
  crash> p "TAB completion"
e64a0b
  crash> p /usr/include/c++/11/string_view:234: ...
e64a0b
  Aborted (core dumped)
e64a0b
e64a0b
When the name string is null (the length of name is zero), there are
e64a0b
multiple places where array access is out of bounds in the gdb/ada-lang.c
e64a0b
(see ada_fold_name() and ada_lookup_name_info()).
e64a0b
e64a0b
The patch backports these gdb patches:
e64a0b
6a780b676637 ("Fix completion related libstdc++ assert when using -D_GLIBCXX_DEBUG")
e64a0b
2ccee230f830 ("Fix off-by-one error in ada_fold_name")
e64a0b
e64a0b
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
e64a0b
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
e64a0b
---
e64a0b
 gdb-10.2.patch | 31 +++++++++++++++++++++++++++++++
e64a0b
 1 file changed, 31 insertions(+)
e64a0b
e64a0b
diff --git a/gdb-10.2.patch b/gdb-10.2.patch
e64a0b
index 1332b6638028..f5e4c06e6f97 100644
e64a0b
--- a/gdb-10.2.patch
e64a0b
+++ b/gdb-10.2.patch
e64a0b
@@ -1591,3 +1591,34 @@
e64a0b
    max += 2;
e64a0b
    limit = cols / max;
e64a0b
    if (limit != 1 && (limit * max == cols))
e64a0b
+--- gdb-10.2/gdb/ada-lang.c.orig
e64a0b
++++ gdb-10.2/gdb/ada-lang.c
e64a0b
+@@ -997,7 +997,7 @@ ada_fold_name (gdb::string_view name)
e64a0b
+   int len = name.size ();
e64a0b
+   GROW_VECT (fold_buffer, fold_buffer_size, len + 1);
e64a0b
+ 
e64a0b
+-  if (name[0] == '\'')
e64a0b
++  if (!name.empty () && name[0] == '\'')
e64a0b
+     {
e64a0b
+       strncpy (fold_buffer, name.data () + 1, len - 2);
e64a0b
+       fold_buffer[len - 2] = '\000';
e64a0b
+@@ -1006,8 +1006,9 @@ ada_fold_name (gdb::string_view name)
e64a0b
+     {
e64a0b
+       int i;
e64a0b
+ 
e64a0b
+-      for (i = 0; i <= len; i += 1)
e64a0b
++      for (i = 0; i < len; i += 1)
e64a0b
+         fold_buffer[i] = tolower (name[i]);
e64a0b
++      fold_buffer[i] = '\0';
e64a0b
+     }
e64a0b
+ 
e64a0b
+   return fold_buffer;
e64a0b
+@@ -13596,7 +13597,7 @@ ada_lookup_name_info::ada_lookup_name_info (const lookup_name_info &lookup_name)
e64a0b
+ {
e64a0b
+   gdb::string_view user_name = lookup_name.name ();
e64a0b
+ 
e64a0b
+-  if (user_name[0] == '<')
e64a0b
++  if (!user_name.empty () && user_name[0] == '<')
e64a0b
+     {
e64a0b
+       if (user_name.back () == '>')
e64a0b
+ 	m_encoded_name
e64a0b
-- 
e64a0b
2.20.1
e64a0b