[PATCH] bug fix in kernel/kmod.c

I think there is a bug in kmod.c: In __call_usermodehelper(), when
kernel_thread(wait_for_helper, ...) return success, since wait_for_helper()
might call complete() at any time, the sub_info should not be used any
more.

Normally wait_for_helper() take a long time to finish, you may not get
problem for most of the case.  But if you remove /sbin/modprobe, it may
become easier for you to get a oop in khelper.

Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Kenneth Lee 2006-09-16 12:15:55 -07:00 committed by Linus Torvalds
parent 1ab7a1f3b4
commit e4b69aa2a1

View file

@ -197,11 +197,12 @@ static void __call_usermodehelper(void *data)
{ {
struct subprocess_info *sub_info = data; struct subprocess_info *sub_info = data;
pid_t pid; pid_t pid;
int wait = sub_info->wait;
/* CLONE_VFORK: wait until the usermode helper has execve'd /* CLONE_VFORK: wait until the usermode helper has execve'd
* successfully We need the data structures to stay around * successfully We need the data structures to stay around
* until that is done. */ * until that is done. */
if (sub_info->wait) if (wait)
pid = kernel_thread(wait_for_helper, sub_info, pid = kernel_thread(wait_for_helper, sub_info,
CLONE_FS | CLONE_FILES | SIGCHLD); CLONE_FS | CLONE_FILES | SIGCHLD);
else else
@ -211,7 +212,7 @@ static void __call_usermodehelper(void *data)
if (pid < 0) { if (pid < 0) {
sub_info->retval = pid; sub_info->retval = pid;
complete(sub_info->complete); complete(sub_info->complete);
} else if (!sub_info->wait) } else if (!wait)
complete(sub_info->complete); complete(sub_info->complete);
} }