Fix unbalanced helper_lock in kernel/kmod.c
call_usermodehelper_exec() has an exit path that can leave the helper_lock() call at the top of the routine unbalanced. The attached patch fixes this issue. Signed-off-by: Nigel Cunningham <nigel@tuxonice.net> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
34aebfd3bd
Коммит
784680336b
|
@ -451,13 +451,11 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
|
|||
enum umh_wait wait)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(done);
|
||||
int retval;
|
||||
int retval = 0;
|
||||
|
||||
helper_lock();
|
||||
if (sub_info->path[0] == '\0') {
|
||||
retval = 0;
|
||||
if (sub_info->path[0] == '\0')
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!khelper_wq || usermodehelper_disabled) {
|
||||
retval = -EBUSY;
|
||||
|
@ -468,13 +466,14 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
|
|||
sub_info->wait = wait;
|
||||
|
||||
queue_work(khelper_wq, &sub_info->work);
|
||||
if (wait == UMH_NO_WAIT) /* task has freed sub_info */
|
||||
return 0;
|
||||
if (wait == UMH_NO_WAIT) /* task has freed sub_info */
|
||||
goto unlock;
|
||||
wait_for_completion(&done);
|
||||
retval = sub_info->retval;
|
||||
|
||||
out:
|
||||
out:
|
||||
call_usermodehelper_freeinfo(sub_info);
|
||||
unlock:
|
||||
helper_unlock();
|
||||
return retval;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче