Skip to content

Commit 594d2a1

Browse files
Li Zetaokees
authored andcommitted
fs/binfmt_elf: Fix memory leak in load_elf_binary()
There is a memory leak reported by kmemleak: unreferenced object 0xffff88817104ef80 (size 224): comm "xfs_admin", pid 47165, jiffies 4298708825 (age 1333.476s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 60 a8 b3 00 81 88 ff ff a8 10 5a 00 81 88 ff ff `.........Z..... backtrace: [<ffffffff819171e1>] __alloc_file+0x21/0x250 [<ffffffff81918061>] alloc_empty_file+0x41/0xf0 [<ffffffff81948cda>] path_openat+0xea/0x3d30 [<ffffffff8194ec89>] do_filp_open+0x1b9/0x290 [<ffffffff8192660e>] do_open_execat+0xce/0x5b0 [<ffffffff81926b17>] open_exec+0x27/0x50 [<ffffffff81a69250>] load_elf_binary+0x510/0x3ed0 [<ffffffff81927759>] bprm_execve+0x599/0x1240 [<ffffffff8192a997>] do_execveat_common.isra.0+0x4c7/0x680 [<ffffffff8192b078>] __x64_sys_execve+0x88/0xb0 [<ffffffff83bbf0a5>] do_syscall_64+0x35/0x80 If "interp_elf_ex" fails to allocate memory in load_elf_binary(), the program will take the "out_free_ph" error handing path, resulting in "interpreter" file resource is not released. Fix it by adding an error handing path "out_free_file", which will release the file resource when "interp_elf_ex" failed to allocate memory. Fixes: 0693ffe ("fs/binfmt_elf.c: allocate less for static executable") Signed-off-by: Li Zetao <[email protected]> Reviewed-by: Alexey Dobriyan <[email protected]> Signed-off-by: Kees Cook <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected]
1 parent 5bf2fed commit 594d2a1

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

fs/binfmt_elf.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
911911
interp_elf_ex = kmalloc(sizeof(*interp_elf_ex), GFP_KERNEL);
912912
if (!interp_elf_ex) {
913913
retval = -ENOMEM;
914-
goto out_free_ph;
914+
goto out_free_file;
915915
}
916916

917917
/* Get the exec headers */
@@ -1354,6 +1354,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
13541354
out_free_dentry:
13551355
kfree(interp_elf_ex);
13561356
kfree(interp_elf_phdata);
1357+
out_free_file:
13571358
allow_write_access(interpreter);
13581359
if (interpreter)
13591360
fput(interpreter);

0 commit comments

Comments
 (0)