Author: Alan Modra Date: Mon Nov 11 10:24:09 2024 +1030 Re: tekhex object file output fixes Commit 8b5a212495 supported *ABS* symbols by allowing "section" to be bfd_abs_section, but bfd_abs_section needs to be treated specially. In particular, bfd_get_next_section_by_name (.., bfd_abs_section_ptr) is invalid. PR 32347 * tekhex.c (first_phase): Guard against modification of _bfd_std_section[] entries. Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=e0323071916878e0634a6e24d8250e4faff67e88] CVE: CVE-2024-53589 Signed-off-by: Yash Shinde diff --git a/bfd/tekhex.c b/bfd/tekhex.c index aea2ebb23df..b305c1f96f1 100644 --- a/bfd/tekhex.c +++ b/bfd/tekhex.c @@ -361,6 +361,7 @@ first_phase (bfd *abfd, int type, char *src, char * src_end) { asection *section, *alt_section; unsigned int len; + bfd_vma addr; bfd_vma val; char sym[17]; /* A symbol can only be 16chars long. */ @@ -368,20 +369,16 @@ first_phase (bfd *abfd, int type, char *src, char * src_end) { case '6': /* Data record - read it and store it. */ - { - bfd_vma addr; - - if (!getvalue (&src, &addr, src_end)) - return false; - - while (*src && src < src_end - 1) - { - insert_byte (abfd, HEX (src), addr); - src += 2; - addr++; - } - return true; - } + if (!getvalue (&src, &addr, src_end)) + return false; + + while (*src && src < src_end - 1) + { + insert_byte (abfd, HEX (src), addr); + src += 2; + addr++; + } + return true; case '3': /* Symbol record, read the segment. */ @@ -406,13 +403,16 @@ first_phase (bfd *abfd, int type, char *src, char * src_end) { case '1': /* Section range. */ src++; - if (!getvalue (&src, §ion->vma, src_end)) + if (!getvalue (&src, &addr, src_end)) return false; if (!getvalue (&src, &val, src_end)) return false; - if (val < section->vma) - val = section->vma; - section->size = val - section->vma; + if (bfd_is_const_section (section)) + break; + section->vma = addr; + if (val < addr) + val = addr; + section->size = val - addr; /* PR 17512: file: objdump-s-endless-loop.tekhex. Check for overlarge section sizes. */ if (section->size & 0x80000000) @@ -455,6 +455,8 @@ first_phase (bfd *abfd, int type, char *src, char * src_end) new_symbol->symbol.flags = BSF_LOCAL; if (stype == '2' || stype == '6') new_symbol->symbol.section = bfd_abs_section_ptr; + else if (bfd_is_const_section (section)) + ; else if (stype == '3' || stype == '7') { if ((section->flags & SEC_DATA) == 0)