• Li Zetao's avatar
    fs/binfmt_elf: Fix memory leak in load_elf_binary() · 594d2a14
    Li Zetao authored
    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: 0693ffeb ("fs/binfmt_elf.c: allocate less for static executable")
    Signed-off-by: default avatarLi Zetao <lizetao1@huawei.com>
    Reviewed-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20221024154421.982230-1-lizetao1@huawei.com
    594d2a14
binfmt_elf.c 61.6 KB