• Linus Torvalds's avatar
    module: fix init_module_from_file() error handling · f1962207
    Linus Torvalds authored
    Vegard Nossum pointed out two different problems with the error handling
    in init_module_from_file():
    
     (a) the idempotent loading code didn't clean up properly in some error
         cases, leaving the on-stack 'struct idempotent' element still in
         the hash table
    
     (b) failure to read the module file would nonsensically update the
         'invalid_kread_bytes' stat counter with the error value
    
    The first error is quite nasty, in that it can then cause subsequent
    idempotent loads of that same file to access stale stack contents of the
    previous failure.  The case may not happen in any normal situation
    (explaining all the "Tested-by's on the original change), and requires
    admin privileges, but syzkaller triggers random bad behavior as a
    result:
    
        BUG: soft lockup in sys_finit_module
        BUG: unable to handle kernel paging request in init_module_from_file
        general protection fault in init_module_from_file
        INFO: task hung in init_module_from_file
        KASAN: out-of-bounds Read in init_module_from_file
        KASAN: slab-out-of-bounds Read in init_module_from_file
        ...
    
    The second error is fairly benign and just leads to nonsensical stats
    (and has been around since the debug stats were added).
    
    Vegard also provided a patch for the idempotent loading issue, but I'd
    rather re-organize the code and make it more legible using another level
    of helper functions than add the usual "goto out" error handling.
    
    Link: https://lore.kernel.org/lkml/20230704100852.23452-1-vegard.nossum@oracle.com/
    Fixes: 9b9879fc ("modules: catch concurrent module loads, treat them as idempotent")
    Reported-by: default avatarVegard Nossum <vegard.nossum@oracle.com>
    Reported-by: default avatarHarshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
    Reported-by: syzbot+9c2bdc9d24e4a7abe741@syzkaller.appspotmail.com
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f1962207
main.c 85.3 KB