From: Alan Modra Date: Tue, 24 Oct 2023 04:52:00 +0000 (+1030) Subject: asan: out of memory in som_set_reloc_info X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=220be060180d14a0512bfb39b22341a7368822ae;p=binutils-gdb.git 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. --- 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');