[binutils-gdb] Fix illegal memory access when bfd_get_section_contents is called with a NULL section pointer.

Nick Clifton nickc@sourceware.org
Wed Jun 5 12:31:21 GMT 2024


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

commit 2db414c36b4f030782c2c8a24c916c3033261af0
Author: Nick Clifton <nickc@redhat.com>
Date:   Wed Jun 5 13:30:27 2024 +0100

    Fix illegal memory access when bfd_get_section_contents is called with a NULL section pointer.
    
      PR 31843

Diff:
---
 bfd/section.c     | 44 ++++++++++++++++++++++++++++++++++----------
 opcodes/nfp-dis.c |  7 +++++++
 2 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/bfd/section.c b/bfd/section.c
index 778a6f75160..81def037e6a 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -1565,24 +1565,36 @@ bfd_get_section_contents (bfd *abfd,
 {
   bfd_size_type sz;
 
-  if (section->flags & SEC_CONSTRUCTOR)
+  if (count == 0)
+    /* Don't bother.  */
+    return true;
+
+  if (section == NULL)
     {
-      memset (location, 0, (size_t) count);
-      return true;
+      bfd_set_error (bfd_error_bad_value);
+      return false;
     }
 
-  sz = bfd_get_section_limit_octets (abfd, section);
-  if ((bfd_size_type) offset > sz
-      || count > sz - offset
-      || count != (size_t) count)
+  if (location == NULL)
     {
+      if (section->mmapped_p)
+	{
+	  /* Pass this request straight on to the target's function.
+	     All of the code below assumes that location != NULL.
+	     FIXME: Should we still check that count is sane ?  */
+	  return BFD_SEND (abfd, _bfd_get_section_contents,
+			   (abfd, section, location, offset, count));
+	}
+
       bfd_set_error (bfd_error_bad_value);
       return false;
     }
 
-  if (count == 0)
-    /* Don't bother.  */
-    return true;
+  if (section->flags & SEC_CONSTRUCTOR)
+    {
+      memset (location, 0, (size_t) count);
+      return true;
+    }
 
   if ((section->flags & SEC_HAS_CONTENTS) == 0)
     {
@@ -1590,6 +1602,18 @@ bfd_get_section_contents (bfd *abfd,
       return true;
     }
 
+  if (abfd == NULL)
+    return false;
+
+  sz = bfd_get_section_limit_octets (abfd, section);
+  if ((bfd_size_type) offset > sz
+      || count > sz - offset
+      || count != (size_t) count)
+    {
+      bfd_set_error (bfd_error_bad_value);
+      return false;
+    }
+
   if ((section->flags & SEC_IN_MEMORY) != 0)
     {
       if (section->contents == NULL)
diff --git a/opcodes/nfp-dis.c b/opcodes/nfp-dis.c
index 093c567100c..ade5fd1d7ad 100644
--- a/opcodes/nfp-dis.c
+++ b/opcodes/nfp-dis.c
@@ -2559,6 +2559,13 @@ init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
       return false;
     }
 
+  if (sec->bfd_section == NULL)
+    {
+      /* See PR 31843 for an example of this.  */
+      dinfo->fprintf_func (dinfo->stream, _("The ME-Config section is corrupt."));
+      return false;
+    }
+
   for (roff = 0; (bfd_size_type) roff < sec->sh_size;
        roff += sec->sh_entsize, menum_linear++)
     {


More information about the Binutils-cvs mailing list