From: Rusty Russell <rusty@rustcorp.com.au>

Milton Miller <miltonm@bga.com> and Junfeng Yang <yjf@stanford.edu> point
out that we hand a kernel address to sys_wait4 for the status pointer. 
This is true, but since we don't have a SIGCHLD handler, it never gets that
far.  Use NULL, and document the fact.



 kernel/kmod.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff -puN kernel/kmod.c~keventd-thread-cleanup kernel/kmod.c
--- 25/kernel/kmod.c~keventd-thread-cleanup	2003-06-16 01:39:34.000000000 -0700
+++ 25-akpm/kernel/kmod.c	2003-06-16 01:39:34.000000000 -0700
@@ -183,12 +183,15 @@ static int wait_for_helper(void *data)
 	struct subprocess_info *sub_info = data;
 	pid_t pid;
 
-	pid = kernel_thread(____call_usermodehelper, sub_info,
-			    CLONE_VFORK | SIGCHLD);
+	sub_info->retval = 0;
+	pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD);
 	if (pid < 0)
 		sub_info->retval = pid;
 	else
-		sys_wait4(pid, (unsigned int *)&sub_info->retval, 0, NULL);
+		/* We don't have a SIGCHLD signal handler, so this
+		 * always returns -ECHILD, but the important thing is
+		 * that it blocks. */
+		sys_wait4(pid, NULL, 0, NULL);
 
 	complete(sub_info->complete);
 	return 0;
@@ -231,8 +234,7 @@ static void __call_usermodehelper(void *
  * (ie. it runs with full root capabilities).
  *
  * Must be called from process context.  Returns a negative error code
- * if program was not execed successfully, or (exitcode << 8 + signal)
- * of the application (0 if wait is not set).
+ * if program was not execed successfully, or 0.
  */
 int call_usermodehelper(char *path, char **argv, char **envp, int wait)
 {

_