asan: out of memory in som_set_reloc_info
authorAlan Modra <amodra@gmail.com>
Tue, 24 Oct 2023 04:52:00 +0000 (15:22 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 25 Oct 2023 00:42:11 +0000 (11:12 +1030)
Sections without SEC_HAS_CONTENTS avoid the file size checks, and of
course it doesn't make sense to read such as the contents are all
zero.

* som.c (som_set_reloc_info): Don't read sections without contents.

bfd/som.c

index d858b8b1468a22df61a70fc282cd8b669fb597e6..dde1f1f8c47906566a25b7c08dc48d0b112cd612 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -5146,28 +5146,30 @@ som_set_reloc_info (unsigned char *fixup,
                     section contents.  */
                  rptr->addend = var ('V');
 
-                 if (rptr->addend == 0 && !section->contents)
+                 if (rptr->addend == 0
+                     && (section->flags & SEC_HAS_CONTENTS) != 0)
                    {
-                     /* Got to read the damn contents first.  We don't
-                        bother saving the contents (yet).  Add it one
-                        day if the need arises.  */
-                     bfd_byte *contents;
-                     if (!bfd_malloc_and_get_section (section->owner, section,
-                                                      &contents))
+                     if (!section->contents)
                        {
-                         free (contents);
-                         return (unsigned) -1;
+                         /* Got to read the damn contents first.  We don't
+                            bother saving the contents (yet).  Add it one
+                            day if the need arises.  */
+                         bfd_byte *contents;
+                         if (!bfd_malloc_and_get_section (section->owner,
+                                                          section, &contents))
+                           {
+                             free (contents);
+                             return (unsigned) -1;
+                           }
+                         section->contents = contents;
+                         deallocate_contents = 1;
                        }
-                     section->contents = contents;
-                     deallocate_contents = 1;
+                     if (offset - var ('L') <= section->size
+                         && section->size - (offset - var ('L')) >= 4)
+                       rptr->addend = bfd_get_32 (section->owner,
+                                                  (section->contents
+                                                   + offset - var ('L')));
                    }
-                 if (rptr->addend == 0
-                     && offset - var ('L') <= section->size
-                     && section->size - (offset - var ('L')) >= 4)
-                   rptr->addend = bfd_get_32 (section->owner,
-                                              (section->contents
-                                               + offset - var ('L')));
-
                }
              else
                rptr->addend = var ('V');