kmod: fix race in usermodehelper code
authorNeil Horman <[email protected]>
Tue, 22 Sep 2009 23:43:36 +0000 (16:43 -0700)
committerLinus Torvalds <[email protected]>
Wed, 23 Sep 2009 14:39:28 +0000 (07:39 -0700)
commitc02e3f361c75da04ca3025b4d19e947e9cc62ed3
tree92605809366dda20430fa9dc7d0b9b9f2f3c0bd9
parent1fd7317d02ec03c6fdf072317841287933d06d24
kmod: fix race in usermodehelper code

The user mode helper code has a race in it.  call_usermodehelper_exec()
takes an allocated subprocess_info structure, which it passes to a
workqueue, and then passes it to a kernel thread which it creates, after
which it calls complete to signal to the caller of
call_usermodehelper_exec() that it can free the subprocess_info struct.

But since we use that structure in the created thread, we can't call
complete from __call_usermodehelper(), which is where we create the kernel
thread.  We need to call complete() from within the kernel thread and then
not use subprocess_info afterward in the case of UMH_WAIT_EXEC.  Tested
successfully by me.

Signed-off-by: Neil Horman <[email protected]>
Cc: Rusty Russell <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
kernel/kmod.c