[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