On 10/3/20 7:38 PM, Philippe Mathieu-Daudé wrote: > On 10/2/20 11:59 PM, Richard Henderson wrote: >> For BTI, we need to know if the executable is static or dynamic, >> which means looking for PT_INTERP earlier. >> >> Signed-off-by: Richard Henderson <richard.hender...@linaro.org> >> --- >> linux-user/elfload.c | 60 +++++++++++++++++++++++--------------------- >> 1 file changed, 31 insertions(+), 29 deletions(-) >> >> diff --git a/linux-user/elfload.c b/linux-user/elfload.c >> index 735ebfa190..6b422990ff 100644 >> --- a/linux-user/elfload.c >> +++ b/linux-user/elfload.c >> @@ -2421,8 +2421,10 @@ static void load_elf_image(const char *image_name, >> int image_fd, >> >> mmap_lock(); >> >> - /* Find the maximum size of the image and allocate an appropriate >> - amount of memory to handle that. */ >> + /* >> + * Find the maximum size of the image and allocate an appropriate >> + * amount of memory to handle that. Locate the interpreter, if any. >> + */ >> loaddr = -1, hiaddr = 0; >> info->alignment = 0; >> for (i = 0; i < ehdr->e_phnum; ++i) { >> @@ -2438,6 +2440,33 @@ static void load_elf_image(const char *image_name, >> int image_fd, >> } >> ++info->nsegs; >> info->alignment |= eppnt->p_align; >> + } else if (eppnt->p_type == PT_INTERP && pinterp_name) { >> + char *interp_name; >> + >> + if (*pinterp_name) { >> + errmsg = "Multiple PT_INTERP entries"; >> + goto exit_errmsg; >> + } >> + interp_name = malloc(eppnt->p_filesz); >> + if (!interp_name) { >> + goto exit_perror; >> + } >> + >> + if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) { >> + memcpy(interp_name, bprm_buf + eppnt->p_offset, >> + eppnt->p_filesz); >> + } else { >> + retval = pread(image_fd, interp_name, eppnt->p_filesz, >> + eppnt->p_offset); >> + if (retval != eppnt->p_filesz) { > > Preexisting, free(interp_name)?
I just sent a patch using g_steal_pointer() instead: https://lists.gnu.org/archive/html/qemu-devel/2020-10/msg00792.html (Maybe I should have tagged it RFC as this is the first time I try this API). > >> + goto exit_perror; >> + } >> + } >> + if (interp_name[eppnt->p_filesz - 1] != 0) { >> + errmsg = "Invalid PT_INTERP entry"; > > Ditto, otherwise: > Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > >> + goto exit_errmsg; >> + } >> + *pinterp_name = interp_name; >> } >> } >> >> @@ -2590,33 +2619,6 @@ static void load_elf_image(const char *image_name, >> int image_fd, >> if (vaddr_em > info->brk) { >> info->brk = vaddr_em; >> } >> - } else if (eppnt->p_type == PT_INTERP && pinterp_name) { >> - char *interp_name; >> - >> - if (*pinterp_name) { >> - errmsg = "Multiple PT_INTERP entries"; >> - goto exit_errmsg; >> - } >> - interp_name = malloc(eppnt->p_filesz); >> - if (!interp_name) { >> - goto exit_perror; >> - } >> - >> - if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) { >> - memcpy(interp_name, bprm_buf + eppnt->p_offset, >> - eppnt->p_filesz); >> - } else { >> - retval = pread(image_fd, interp_name, eppnt->p_filesz, >> - eppnt->p_offset); >> - if (retval != eppnt->p_filesz) { >> - goto exit_perror; >> - } >> - } >> - if (interp_name[eppnt->p_filesz - 1] != 0) { >> - errmsg = "Invalid PT_INTERP entry"; >> - goto exit_errmsg; >> - } >> - *pinterp_name = interp_name; >> #ifdef TARGET_MIPS >> } else if (eppnt->p_type == PT_MIPS_ABIFLAGS) { >> Mips_elf_abiflags_v0 abiflags; >> > >