[binutils-gdb] PR17910 sym string offset check

Alan Modra amodra@sourceware.org
Tue Mar 21 22:48:45 GMT 2023


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=317e47ee5e7c539807d6cd16bde5c274025e8ee1

commit 317e47ee5e7c539807d6cd16bde5c274025e8ee1
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Mar 22 09:05:10 2023 +1030

    PR17910 sym string offset check
    
    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.

Diff:
---
 bfd/coffgen.c | 5 +----
 bfd/peicode.h | 1 +
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index f21cf2ca523..774edf76f24 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -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;
     }
diff --git a/bfd/peicode.h b/bfd/peicode.h
index b7b4f4abbb9..f1f3ce81533 100644
--- a/bfd/peicode.h
+++ b/bfd/peicode.h
@@ -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;


More information about the Binutils-cvs mailing list