• Thiago Jung Bauermann's avatar
    kexec: fix double-free when failing to relocate the purgatory · 070c43ee
    Thiago Jung Bauermann authored
    If kexec_apply_relocations fails, kexec_load_purgatory frees pi->sechdrs
    and pi->purgatory_buf.  This is redundant, because in case of error
    kimage_file_prepare_segments calls kimage_file_post_load_cleanup, which
    will also free those buffers.
    
    This causes two warnings like the following, one for pi->sechdrs and the
    other for pi->purgatory_buf:
    
      kexec-bzImage64: Loading purgatory failed
      ------------[ cut here ]------------
      WARNING: CPU: 1 PID: 2119 at mm/vmalloc.c:1490 __vunmap+0xc1/0xd0
      Trying to vfree() nonexistent vm area (ffffc90000e91000)
      Modules linked in:
      CPU: 1 PID: 2119 Comm: kexec Not tainted 4.8.0-rc3+ #5
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
      Call Trace:
        dump_stack+0x4d/0x65
        __warn+0xcb/0xf0
        warn_slowpath_fmt+0x4f/0x60
        ? find_vmap_area+0x19/0x70
        ? kimage_file_post_load_cleanup+0x47/0xb0
        __vunmap+0xc1/0xd0
        vfree+0x2e/0x70
        kimage_file_post_load_cleanup+0x5e/0xb0
        SyS_kexec_file_load+0x448/0x680
        ? putname+0x54/0x60
        ? do_sys_open+0x190/0x1f0
        entry_SYSCALL_64_fastpath+0x13/0x8f
      ---[ end trace 158bb74f5950ca2b ]---
    
    Fix by setting pi->sechdrs an pi->purgatory_buf to NULL, since vfree
    won't try to free a NULL pointer.
    
    Link: http://lkml.kernel.org/r/1472083546-23683-1-git-send-email-bauerman@linux.vnet.ibm.comSigned-off-by: default avatarThiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
    Acked-by: default avatarBaoquan He <bhe@redhat.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Vivek Goyal <vgoyal@redhat.com>
    Cc: Dave Young <dyoung@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    070c43ee
kexec_file.c 24.5 KB