When arch_setup_additional_pages() fails, interp_elf_ex may not have been freed, which leads to memleak. It's the same when create_elf_tables() fails. Signed-off-by: Dinghao Liu <dinghao.liu@xxxxxxxxxx> --- fs/binfmt_elf.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 13d053982dd7..984c30684e49 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -1204,6 +1204,7 @@ static int load_elf_binary(struct linux_binprm *bprm) fput(interpreter); kfree(interp_elf_ex); + interp_elf_ex = NULL; kfree(interp_elf_phdata); } else { elf_entry = e_entry; @@ -1219,14 +1220,18 @@ static int load_elf_binary(struct linux_binprm *bprm) #ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES retval = arch_setup_additional_pages(bprm, !!interpreter); - if (retval < 0) + if (retval < 0) { + kfree(interp_elf_ex); goto out; + } #endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */ retval = create_elf_tables(bprm, elf_ex, load_addr, interp_load_addr, e_entry); - if (retval < 0) + if (retval < 0) { + kfree(interp_elf_ex); goto out; + } mm = current->mm; mm->end_code = end_code; -- 2.17.1