Hi Serhei,

On Wed, Jul 22, 2026 at 04:01:09PM -0400, Serhei Makarov wrote:
> The generic code in ebl_set_initial_registers_sample is meant to be
> used on arches with simple/small register files and a contiguous
> linear mapping of perf_regs<->dwarf_regs. Make sure to guard it with a
> check of ebl->perf_frame_regs_mask (the canonical sign that
> sample_regs is supported for this arch).
> 
> Otherwise, a hypothetical call to ebl_set_initial_registers_sample()
> on an unsupported arch with many regs falls through to the generic
> code and ends up writing out of bounds to the dwarf_regs array,
> (at least in builds where the assert is also compiled out).
> 
> Based on Sayed Kaif's patch and problem report cf
> https://sourceware.org/pipermail/elfutils-devel/2026q2/009378.html
> 
> * libebl/eblinitreg_sample.c (ebl_set_initial_registers_sample):
>   Guard the generic code on ebl->perf_frame_regs_mask != 0.

The guard looks correct. Not a fan of asserts in library code, but
here it seems appropriate. At least now it has an explicit comment
explaining why.

> Reported-by: Sayed Kaif <[email protected]>
> Signed-off-by: Serhei Makarov <[email protected]>
> ---
>  libebl/eblinitreg_sample.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/libebl/eblinitreg_sample.c b/libebl/eblinitreg_sample.c
> index feba2c64..32c1ab1c 100644
> --- a/libebl/eblinitreg_sample.c
> +++ b/libebl/eblinitreg_sample.c
> @@ -61,10 +61,18 @@ ebl_set_initial_registers_sample (Ebl *ebl,
>                                               regs_mapping, n_regs_mapping,
>                                               setfunc, arg);
>  
> -  /* If set_initial_registers_sample is unspecified, then it is safe
> -     to use the following generic code to populate a contiguous array
> -     of dwarf_regs:  */
> +  /* If perf_frame_regs_mask is zero, then the sample_regs
> +     functionality is unsupported by this Ebl:  */
> +  if (ebl->perf_frame_regs_mask == 0)
> +    return false;
> +
> +  /* If set_initial_registers_sample is unspecified, and
> +     perf_frame_regs_mask is nonzero, then it is safe to use the
> +     following generic code to populate a contiguous small array of
> +     dwarf_regs:  */
>    Dwarf_Word dwarf_regs[64];
> +  /* An Ebl that fails this assert is missing a custom
> +     set_initial_registers_sample implementation:  */
>    assert (ebl->frame_nregs < 64);
>    size_t i;
>    for (i = 0; i < ebl->frame_nregs; i++)

Thanks,

Mark

Reply via email to