An off-by-one error in auxv setup for RISC-V

Ivan Komarov Ivan.Komarov at dfyz.info
Mon Jan 1 22:04:05 PST 2024


Hi,

Currently, the maximum size of the auxiliary vector is bounded (in
include/linux/mm_types.h) by the sum of the maximum size of
architecture-independent entries (AT_VECTOR_SIZE_BASE) and
architecture-specific ones (AT_VECTOR_SIZE_ARCH).

Commit e92f469b0771 added a new RISC-V-specific auxv entry to indicate
the signal frame size to userspace, but unfortunately didn't bump
AT_VECTOR_SIZE_ARCH, which can result in writing past the end of
mm->saved_auxv in create_elf_tables() from fs/binfmt_elf.c.

In practice, this is mostly harmless:
  * not all architecture-independent entires are actually used on RISC-V,
    so we still have plenty of space left in mm->saved_auxv even with
    the off-by-one
  * even if the overflow happened, kernels compiled with
    CONFIG_HARDENED_USERCOPY would detect it when copying auxv entries
    to userspace

Still, it might be good to fix this. My friend had already tried to send a
patch for this
(see https://lore.kernel.org/all/73883406.20231215232720@torrio.net/),
which had some process issues. This time, we're trying to do things properly,
including a Closes: tag that references a bug report (this e-mail).



More information about the linux-riscv mailing list