• Tong Zhang's avatar
    binfmt_misc: fix crash when load/unload module · e7f1e883
    Tong Zhang authored
    We should unregister the table upon module unload otherwise something
    horrible will happen when we load binfmt_misc module again.  Also note
    that we should keep value returned by register_sysctl_mount_point() and
    release it later, otherwise it will leak.
    
    Also, per Christian's comment, to fully restore the old behavior that
    won't break userspace the check(binfmt_misc_header) should be
    eliminated.
    
    To reproduce:
      modprobe binfmt_misc
      modprobe -r binfmt_misc
      modprobe binfmt_misc
      modprobe -r binfmt_misc
      modprobe binfmt_misc
    
    resulting in
    
      modprobe: can't load module binfmt_misc (kernel/fs/binfmt_misc.ko): Cannot allocate memory
    
    and an unhappy kernel:
    
      binfmt_misc: Failed to create fs/binfmt_misc sysctl mount point
      binfmt_misc: Failed to create fs/binfmt_misc sysctl mount point
      BUG: unable to handle page fault for address: fffffbfff8004802
      Call Trace:
        init_misc_binfmt+0x2d/0x1000 [binfmt_misc]
    
    Link: https://lkml.kernel.org/r/20220124181812.1869535-2-ztong0001@gmail.com
    Fixes: 3ba442d5 ("fs: move binfmt_misc sysctl to its own file")
    Signed-off-by: default avatarTong Zhang <ztong0001@gmail.com>
    Co-developed-by: Christian Brauner<brauner@kernel.org>
    Acked-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
    Cc: Eric Biederman <ebiederm@xmission.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Iurii Zaikin <yzaikin@google.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e7f1e883
binfmt_misc.c 17.5 KB