aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2020-10-14 12:24:42 +0200
committerTom de Vries <tdevries@suse.de>2020-10-14 12:24:42 +0200
commit76547ab31b16b521e29892cab5a29b60b52291a5 (patch)
treeed977f6bb0d35d24d8137921b1920eb8bb260f46
parent7b47a312561818d9853f8e89fa43a86304f7040c (diff)
downloadgdb-76547ab31b16b521e29892cab5a29b60b52291a5.zip
gdb-76547ab31b16b521e29892cab5a29b60b52291a5.tar.gz
gdb-76547ab31b16b521e29892cab5a29b60b52291a5.tar.bz2
[gdb] Fix segfault in solib_contains_address_p
Starting commit bb2a67773c "Use a std::vector in target_section_table" we run into: ... ERROR: GDB process no longer exists GDB process exited with wait status 22239 exp12 0 0 CHILDKILLED SIGABRT UNRESOLVED: gdb.base/exec-invalid-sysroot.exp: continue to exec catchpoint ... which reproduces as: ... Thread 1 "gdb" received signal SIGSEGV, Segmentation fault. solib_contains_address_p (address=4196111, solib=0x1dd9970) at /home/vries/gdb_versions/devel/src/gdb/solib.c:1120 1120 for (target_section &p : solib->sections->sections) (gdb) p solib->sections->sections Cannot access memory at address 0x0 ... Fix this by handling solib->sections == nullptr in solib_contains_address_p. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2020-10-14 Tom de Vries <tdevries@suse.de> PR gdb/26733 * solib.c (solib_contains_address_p): Handle 'solib->sections == nullptr'.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/solib.c3
2 files changed, 9 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 954eaa3..70e1e81 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2020-10-14 Tom de Vries <tdevries@suse.de>
+
+ PR gdb/26733
+ * solib.c (solib_contains_address_p): Handle
+ 'solib->sections == nullptr'.
+
2020-10-13 Simon Marchi <simon.marchi@polymtl.ca>
PR gdb/26642
diff --git a/gdb/solib.c b/gdb/solib.c
index b486442..28f6a4e 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -1113,6 +1113,9 @@ bool
solib_contains_address_p (const struct so_list *const solib,
CORE_ADDR address)
{
+ if (solib->sections == nullptr)
+ return false;
+
for (target_section &p : *solib->sections)
if (p.addr <= address && address < p.endaddr)
return true;