From 220be060180d14a0512bfb39b22341a7368822ae Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 24 Oct 2023 15:22:00 +1030 Subject: [PATCH] asan: out of memory in som_set_reloc_info 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 | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/bfd/som.c b/bfd/som.c index d858b8b1468..dde1f1f8c47 100644 --- 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'); -- 2.30.2