core_pattern: fix up a few miscellaneous bugs

Fix do_coredump to detect a crash in the user mode helper process and abort
the attempt to recursively dump core to another copy of the helper process,
potentially ad-infinitum.

[akpm@linux-foundation.org: cleanups]
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
Cc: <martin.pitt@ubuntu.com>
Cc: <wwoods@redhat.com>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Neil Horman 2007-10-16 23:26:36 -07:00 committed by Linus Torvalds
parent 74aadce986
commit 3232113710

View File

@ -1762,14 +1762,27 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
goto fail_unlock;
if (ispipe) {
core_limit = RLIM_INFINITY;
helper_argv = argv_split(GFP_KERNEL, corename+1, &helper_argc);
/* Terminate the string before the first option */
delimit = strchr(corename, ' ');
if (delimit)
*delimit = '\0';
delimit = strrchr(helper_argv[0], '/');
if (delimit)
delimit++;
else
delimit = helper_argv[0];
if (!strcmp(delimit, current->comm)) {
printk(KERN_NOTICE "Recursive core dump detected, "
"aborting\n");
goto fail_unlock;
}
core_limit = RLIM_INFINITY;
/* SIGPIPE can happen, but it's just never processed */
if(call_usermodehelper_pipe(corename+1, helper_argv, NULL, &file)) {
if (call_usermodehelper_pipe(corename+1, helper_argv, NULL,
&file)) {
printk(KERN_INFO "Core dump to %s pipe failed\n",
corename);
goto fail_unlock;