PR17910 sym string offset check
authorAlan Modra <amodra@gmail.com>
Tue, 21 Mar 2023 22:35:10 +0000 (09:05 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 21 Mar 2023 22:35:10 +0000 (09:05 +1030)
As far as I can see the only place that sets obj_coff_strings without
setting obj_coff_strings_len is pe_ILF_build_a_bfd.  Fix that and we
can simplify the sym string offset check.  This is just a tidy.
pe_ILF_build_a_bfd doesn't create bad symbols and
_bfd_coff_read_string_table will always result in non-zero
obj_coff_strings_len when obj_coff_strings is non-NULL.

PR 17910
* coffgen.c (_bfd_coff_internal_syment_name): Always sanity
check sym string offset.
* peicode.h (pe_ILF_build_a_bfd): Set obj_coff_strings_len.

bfd/coffgen.c
bfd/peicode.h

index f21cf2ca523c56110cd295acd232d1eba569bc45..774edf76f24701225f890cad0aceb0538f334236 100644 (file)
@@ -443,10 +443,7 @@ _bfd_coff_internal_syment_name (bfd *abfd,
          if (strings == NULL)
            return NULL;
        }
-      /* PR 17910: Only check for string overflow if the length has been set.
-        Some DLLs, eg those produced by Visual Studio, may not set the length field.  */
-      if (obj_coff_strings_len (abfd) > 0
-         && sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd))
+      if (sym->_n._n_n._n_offset >= obj_coff_strings_len (abfd))
        return NULL;
       return strings + sym->_n._n_n._n_offset;
     }
index b7b4f4abbb946425ed376b0aac110777e5734f61..f1f3ce815331041d3bebf30fdc3e74bab292f20d 100644 (file)
@@ -1147,6 +1147,7 @@ pe_ILF_build_a_bfd (bfd *     abfd,
   obj_conv_table_size (abfd) = vars.sym_index;
 
   obj_coff_strings (abfd) = vars.string_table;
+  obj_coff_strings_len (abfd) = vars.string_ptr - vars.string_table;
   obj_coff_keep_strings (abfd) = true;
 
   return true;