• Martin Schwidefsky's avatar
    kernel/kmod.c: fix a race condition in usermodehelper. · 579adde4
    Martin Schwidefsky authored
    There is a race between call_usermodehelper_keys, __call_usermodehelper
    and wait_for_helper. It should only happen if preemption is enabled or
    on a virtualized system.
    
    If the cpu is preempted or put to sleep by the hypervisor in
    __call_usermodehelper between the creation of the wait_for_helper
    thread and the second check on sub_info->wait, the whole execution
    of wait_for_helper including the complete call and the continuation
    after the wait_for_completion in call_usermodehelper_keys can have
    happened before __call_usermodehelper checks sub_info->wait for the
    second time. Since sub_info can already have been clobbered,
    sub_info->wait could be zero and complete is called a second time
    with an invalid argument. This has happened on s390. It took me only
    three days to find out ..
    
    Thanks to Arnd Bergmann for his help to spot this bug.
    
    Kenneth Lee also sent the same patch independently.
    Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
    Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
    579adde4
kmod.c 7.58 KB