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
