]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR32663, ld buffer overflow reading .debug_info
authorAlan Modra <amodra@gmail.com>
Sun, 9 Feb 2025 09:45:02 +0000 (20:15 +1030)
committerAlan Modra <amodra@gmail.com>
Sun, 9 Feb 2025 10:12:58 +0000 (20:42 +1030)
When reading debug info to print an error message, we'll be reading
the debug info off disk, not using edited debug info.  sec->rawsize
if non-zero is the correct size.

PR 32663
* dwarf2.c (_bfd_dwarf2_slurp_debug_info): Use
bfd_get_section_limit_octets to properly size debug sections.

bfd/dwarf2.c

index bc17347fbf854a2c658b59b132b2d5f440f05842..a62c952374378a39c8d7896e0728ff9581ada349 100644 (file)
@@ -5513,7 +5513,7 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
   if (! find_debug_info (debug_bfd, debug_sections, msec))
     {
       /* Case 1: only one info section.  */
-      total_size = msec->size;
+      total_size = bfd_get_section_limit_octets (debug_bfd, msec);
       if (! read_section (debug_bfd, &stash->debug_sections[debug_info],
                          symbols, 0,
                          &stash->f.dwarf_info_buffer, &total_size))
@@ -5528,13 +5528,14 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
        {
          if (bfd_section_size_insane (debug_bfd, msec))
            goto restore_vma;
+         bfd_size_type readsz = bfd_get_section_limit_octets (debug_bfd, msec);
          /* Catch PR25070 testcase overflowing size calculation here.  */
-         if (total_size + msec->size < total_size)
+         if (total_size + readsz < total_size)
            {
              bfd_set_error (bfd_error_no_memory);
              goto restore_vma;
            }
-         total_size += msec->size;
+         total_size += readsz;
        }
 
       stash->f.dwarf_info_buffer = (bfd_byte *) bfd_malloc (total_size);
@@ -5546,10 +5547,8 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
           msec;
           msec = find_debug_info (debug_bfd, debug_sections, msec))
        {
-         bfd_size_type size;
-
-         size = msec->size;
-         if (size == 0)
+         bfd_size_type readsz = bfd_get_section_limit_octets (debug_bfd, msec);
+         if (readsz == 0)
            continue;
 
          if (!(bfd_simple_get_relocated_section_contents
@@ -5557,7 +5556,7 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
                 symbols)))
            goto restore_vma;
 
-         total_size += size;
+         total_size += readsz;
        }
     }