From: Chris Wright Anything wrong with just setting a SIG_DFL handler? W.R.T. the kernel pointer, either Andrew's patch which does put_user/__put_user depending on context, or some ugly set_fs() should work. This simplistic approach works for me, thoughts? 25-akpm/kernel/kmod.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) diff -puN kernel/kmod.c~call_usermodehelper-retval-fix-2 kernel/kmod.c --- 25/kernel/kmod.c~call_usermodehelper-retval-fix-2 Thu Sep 25 12:43:14 2003 +++ 25-akpm/kernel/kmod.c Thu Sep 25 12:43:14 2003 @@ -181,16 +181,24 @@ static int wait_for_helper(void *data) { struct subprocess_info *sub_info = data; pid_t pid; + struct k_sigaction sa; + + sa.sa.sa_handler = SIG_DFL; + sa.sa.sa_flags = 0; + siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD)); + do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0); sub_info->retval = 0; pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD); if (pid < 0) sub_info->retval = pid; - else - /* 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); + else { + mm_segment_t old_fs; + old_fs = get_fs(); + set_fs(KERNEL_DS); + sys_wait4(pid, &sub_info->retval, 0, NULL); + set_fs(old_fs); + } complete(sub_info->complete); return 0; _