Check objfile->sf in ada-lang.c
authorTom Tromey <tromey@adacore.com>
Tue, 2 Mar 2021 18:57:01 +0000 (11:57 -0700)
committerTom Tromey <tromey@adacore.com>
Tue, 2 Mar 2021 19:00:44 +0000 (12:00 -0700)
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.

gdb/ChangeLog
gdb/ada-lang.c

index bb7b2de0b58f6e2d21bee6cb6968aec503ed3ef1..d9d5b4f9cb7cc398345550b9b28aadaaef7d4b07 100644 (file)
@@ -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
index 419347f776d9edbfaf45ae4ebab79fbece5fd9cc..91a2a5ce1df84466cfd0dc3ea1195da21732b755 100644 (file)
@@ -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);
        }
     }          
 }