[PATCH 3/4] elf: Avoid linker crash on corrupt .eh_frame section

H.J. Lu hjl.tools@gmail.com
Tue Sep 23 20:46:58 GMT 2025


On Tue, Sep 23, 2025 at 10:50 PM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 23.09.2025 04:23, H.J. Lu wrote:
> > Return false on corrupt .eh_frame section.  Cap the .eh_frame section
> > alignment to the larger of the section size and the pointer size.
>
> Like for patch 2, I'm unconvinced of it being a good idea to build in
> heuristics like this. What if someone feels a need to align .eh_frame
> to, say, a page boundary?

.eh_frame section is special:

     eh_alignment = ((1 << o->alignment_power)
                      * bfd_octets_per_byte (output_bfd, o));
      /* Skip over zero terminator, and prevent empty sections from
         adding alignment padding at the end.  */
      for (i = o->map_tail.s; i != NULL; i = i->map_tail.s)
        if (i->size == 0)
          i->flags |= SEC_EXCLUDE;
        else if (i->size > 4)
          break;
      /* The last non-empty eh_frame section doesn't need padding.  */
      if (i != NULL)
        i = i->map_tail.s;
      /* Any prior sections must pad the last FDE out to the output
         section alignment.  Otherwise we might have zero padding
         between sections, which would be seen as a terminator.  */
      for (; i != NULL; i = i->map_tail.s)
        if (i->size == 4)
          /* All but the last zero terminator should have been removed.  */
          BFD_FAIL ();
        else
          {
            bfd_size_type size
              = (i->size + eh_alignment - 1) & -eh_alignment;

If .eh_frame section alignment is larger than the section size,
we will get buffer overflow.

            if (i->size != size)
              {
                i->size = size;
                changed = 1;
                eh_changed = 1;
              }
          }

> Also, please format unsigned long-s using %lu or (here) %lx. Especially
> when values get large, imo printing them as decimal is unhelpful.

Will do.

> Finally - why would .eh_frame be special in this regard? What about,
> say, .sframe?
>

.sframe section doesn't do the code above.

-- 
H.J.


More information about the Binutils mailing list