aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2021-03-02 11:57:01 -0700
committerTom Tromey <tromey@adacore.com>2021-03-02 12:00:44 -0700
commit1228719f312c22a3ce4ade10d175b80ac5cedb08 (patch)
tree6d54243422cec0008c6fb60a7b77ea5aa09dc4de /gdb
parentca8f6bc629cb27792ce449e7253c74a3f6f75fda (diff)
downloadbinutils-1228719f312c22a3ce4ade10d175b80ac5cedb08.zip
binutils-1228719f312c22a3ce4ade10d175b80ac5cedb08.tar.gz
binutils-1228719f312c22a3ce4ade10d175b80ac5cedb08.tar.bz2
Check objfile->sf in ada-lang.c
Most places in gdb that reference objfile->sf also check that it is not null. It is valid for it to be null, because find_sym_fns can return null for some kinds of object file. However, it's rare to encounter this scenario with Ada code. I only encountered it when looking at a fork of gdb that, I believe, makes its own objfiles without setting 'sf'. This patch changes ada-lang.c to check this field before using it. This avoids any potential crash here. There's no test case because I'm not even sure this is possible to trip over with an unmodified gdb. There are some other unchecked uses in gdb, but at a quick glance they all seem to be involved with symbol reading, which of course won't happen when sf==null. gdb/ChangeLog 2021-03-02 Tom Tromey <tromey@adacore.com> * ada-lang.c (add_nonlocal_symbols): Handle case where objfile->sf is null.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-lang.c16
2 files changed, 14 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index bb7b2de..d9d5b4f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2021-03-02 Tom Tromey <tromey@adacore.com>
+
+ * ada-lang.c (add_nonlocal_symbols): Handle case where objfile->sf
+ is null.
+
2021-02-27 Lancelot Six <lsix@lancelotsix.com>
PR gdb/27393
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 419347f..91a2a5c 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -5629,10 +5629,11 @@ add_nonlocal_symbols (struct obstack *obstackp,
{
data.objfile = objfile;
- objfile->sf->qf->map_matching_symbols (objfile, lookup_name,
- domain, global, callback,
- (is_wild_match
- ? NULL : compare_names));
+ if (objfile->sf != nullptr)
+ objfile->sf->qf->map_matching_symbols (objfile, lookup_name,
+ domain, global, callback,
+ (is_wild_match
+ ? NULL : compare_names));
for (compunit_symtab *cu : objfile->compunits ())
{
@@ -5654,9 +5655,10 @@ add_nonlocal_symbols (struct obstack *obstackp,
for (objfile *objfile : current_program_space->objfiles ())
{
data.objfile = objfile;
- objfile->sf->qf->map_matching_symbols (objfile, name1,
- domain, global, callback,
- compare_names);
+ if (objfile->sf != nullptr)
+ objfile->sf->qf->map_matching_symbols (objfile, name1,
+ domain, global, callback,
+ compare_names);
}
}
}