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:
Nigel Cunningham 2008-01-17 15:21:21 -08:00 committed by Linus Torvalds
parent 34aebfd3bd
commit 784680336b

View file

@ -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;
}