gdb: bfd_get_symbol_leading_char vs. ""
authorAlan Modra <amodra@gmail.com>
Tue, 22 Aug 2023 11:50:57 +0000 (21:20 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 23 Aug 2023 00:37:45 +0000 (10:07 +0930)
Some places matching the first char of a string against
bfd_get_symbol_leading_char, which may be zero, didn't check for "".
This could lead to accesses past the end of the string and potential
buffer overruns.  Fix that, and also get rid of a stupid optimisation
in dbxread when looking for "__DYNAMIC" that also might access past
the end of a string.

gdb/coffread.c
gdb/dbxread.c
gdb/machoread.c

index 13610998ad74a47513f288e1e349edfbd734052e..7998327fdaf2637b4356142ba8c5843fc10cda78 100644 (file)
@@ -64,8 +64,8 @@ static const registry<objfile>::key<coff_symfile_info> coff_objfile_data_key;
 
 /* Translate an external name string into a user-visible name.  */
 #define        EXTERNAL_NAME(string, abfd) \
-       (string[0] == bfd_get_symbol_leading_char (abfd) \
-       ? string + 1 : string)
+  (*string && *string == bfd_get_symbol_leading_char (abfd)    \
+   ? string + 1 : string)
 
 /* To be an sdb debug type, type must have at least a basic or primary
    derived type.  Using this rather than checking against T_NULL is
index 7cddf6586edd8796387332c0b780e623590400b2..4c585efd192818f461cbde0c214417ef88b7ce83 100644 (file)
@@ -479,14 +479,15 @@ record_minimal_symbol (minimal_symbol_reader &reader,
         Record it as global even if it's local, not global, so
         lookup_minimal_symbol can find it.  We don't check symbol_leading_char
         because for SunOS4 it always is '_'.  */
-      if (name[8] == 'C' && strcmp ("__DYNAMIC", name) == 0)
+      if (strcmp ("__DYNAMIC", name) == 0)
        ms_type = mst_data;
 
       /* Same with virtual function tables, both global and static.  */
       {
        const char *tempstring = name;
 
-       if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd.get ()))
+       if (*tempstring
+           && *tempstring == bfd_get_symbol_leading_char (objfile->obfd.get ()))
          ++tempstring;
        if (is_vtable_name (tempstring))
          ms_type = mst_data;
@@ -2254,7 +2255,8 @@ read_ofile_symtab (struct objfile *objfile, legacy_psymtab *pst)
            processing_gcc_compilation = 1;
          else if (strcmp (namestring, GCC2_COMPILED_FLAG_SYMBOL) == 0)
            processing_gcc_compilation = 2;
-         if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
+         if (*tempstring
+             && *tempstring == bfd_get_symbol_leading_char (symfile_bfd))
            ++tempstring;
          if (startswith (tempstring, "__gnu_compiled"))
            processing_gcc_compilation = 2;
index 5154d1a31a38410a9f663b88de6c4a31afb465ba..615e08c6afa85e5091ced6eec59e5ca0db9256ad 100644 (file)
@@ -394,7 +394,8 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
   struct bound_minimal_symbol msym;
   const char *name = sym->name;
 
-  if (name[0] == bfd_get_symbol_leading_char (main_objfile->obfd.get ()))
+  if (*name
+      && *name == bfd_get_symbol_leading_char (main_objfile->obfd.get ()))
     ++name;
   msym = lookup_minimal_symbol (name, NULL, main_objfile);
   if (msym.minsym == NULL)