Li Zetao 594d2a14f2 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: 0693ffebcfe5 ("fs/binfmt_elf.c: allocate less for static executable")
Signed-off-by: Li Zetao <lizetao1@huawei.com>
Reviewed-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20221024154421.982230-1-lizetao1@huawei.com
2022-10-25 15:11:21 -07:00
..
2022-07-02 18:52:21 +09:00
2022-10-06 17:13:18 -07:00
2022-10-10 19:45:17 -07:00
2022-10-03 20:33:41 -07:00
2022-10-04 13:38:03 -07:00
2022-10-07 09:19:14 -07:00
2022-10-10 19:45:17 -07:00
2022-10-10 20:13:22 -07:00
2022-05-09 16:21:45 -04:00
2022-10-10 19:45:17 -07:00
2022-08-03 10:35:43 -07:00
2022-10-07 08:19:26 -07:00
2022-09-24 07:00:00 +02:00
2022-10-13 09:58:42 -07:00
2022-10-10 19:45:17 -07:00
2022-10-10 19:45:17 -07:00
2022-05-09 16:21:46 -04:00
2022-10-10 19:45:17 -07:00
2022-09-11 20:26:07 -07:00
2022-10-06 17:36:48 -07:00
2022-08-11 13:11:49 -07:00
2022-09-24 07:00:00 +02:00
2022-08-20 11:34:33 -04:00
2022-10-10 19:45:17 -07:00
2022-06-29 13:07:16 +02:00
2022-10-06 16:49:00 -07:00
2022-04-01 19:35:56 -07:00
2022-10-10 14:21:11 -07:00
2022-08-03 10:35:43 -07:00
2022-10-10 19:45:17 -07:00
2022-10-06 17:13:18 -07:00
2022-06-28 13:58:05 -04:00
2022-05-22 21:03:01 +01:00