[PATCH v3] mips: dl-machine-reject-phdr: Get rid of alloca.
Joe Simmons-Talbott
josimmon@redhat.com
Tue Aug 29 19:30:19 GMT 2023
Ping.
On Mon, Jun 26, 2023 at 09:16:21AM -0400, Joe Simmons-Talbott wrote:
> Read directly into the mips_abiflags struct rather than reading the
> entire segment and using alloca when the passed buffer is not big enough.
>
> Checked with build-many-glibcs.py on mips-linux-gnu
> ---
> Changes to v2:
> * Rather than use a scratch buffer use the mips_abiflags struct itself
> for reading since we're now just reading that much data and not the
> whole segment.
>
> sysdeps/mips/dl-machine-reject-phdr.h | 26 ++++++++++----------------
> 1 file changed, 10 insertions(+), 16 deletions(-)
>
> diff --git a/sysdeps/mips/dl-machine-reject-phdr.h b/sysdeps/mips/dl-machine-reject-phdr.h
> index 104b590661..b784697fc1 100644
> --- a/sysdeps/mips/dl-machine-reject-phdr.h
> +++ b/sysdeps/mips/dl-machine-reject-phdr.h
> @@ -161,7 +161,7 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum,
> Lmid_t nsid;
> int in_abi = -1;
> struct abi_req in_req;
> - Elf_MIPS_ABIFlags_v0 *mips_abiflags = NULL;
> + Elf_MIPS_ABIFlags_v0 mips_abiflags;
> bool perfect_match = false;
> #if _MIPS_SIM == _ABIO32
> unsigned int cur_mode = -1;
> @@ -176,25 +176,19 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum,
> /* Read the attributes section. */
> if (ph != NULL)
> {
> - ElfW(Addr) size = ph->p_filesz;
> + ElfW(Addr) size = sizeof (Elf_MIPS_ABIFlags_v0);
>
> - if (ph->p_offset + size <= len)
> - mips_abiflags = (Elf_MIPS_ABIFlags_v0 *) (buf + ph->p_offset);
> - else
> - {
> - mips_abiflags = alloca (size);
> - __lseek (fd, ph->p_offset, SEEK_SET);
> - if (__libc_read (fd, (void *) mips_abiflags, size) != size)
> - REJECT (" unable to read PT_MIPS_ABIFLAGS\n");
> - }
> -
> - if (size < sizeof (Elf_MIPS_ABIFlags_v0))
> + if (ph->p_filesz < size)
> REJECT (" contains malformed PT_MIPS_ABIFLAGS\n");
>
> - if (__glibc_unlikely (mips_abiflags->flags2 != 0))
> - REJECT (" unknown MIPS.abiflags flags2: %u\n", mips_abiflags->flags2);
> + __lseek (fd, ph->p_offset, SEEK_SET);
> + if (__libc_read (fd, (void *) &mips_abiflags, size) != size)
> + REJECT (" unable to read PT_MIPS_ABIFLAGS\n");
> +
> + if (__glibc_unlikely (mips_abiflags.flags2 != 0))
> + REJECT (" unknown MIPS.abiflags flags2: %u\n", mips_abiflags.flags2);
>
> - in_abi = mips_abiflags->fp_abi;
> + in_abi = mips_abiflags.fp_abi;
> }
>
> /* ANY is compatible with anything. */
> --
> 2.39.2
>
More information about the Libc-alpha
mailing list