Skip to content

Commit

Permalink
Fix unbalanced helper_lock in kernel/kmod.c
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nigel Cunningham authored and Linus Torvalds committed Jan 17, 2008
1 parent 34aebfd commit 7846803
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions kernel/kmod.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down

0 comments on commit 7846803

Please sign in to comment.