diff options
author | Neil Horman <nhorman@tuxdriver.com> | 2007-10-17 02:26:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 11:42:50 -0400 |
commit | 7dc0b22e3c54f1f4730354fef84a20f5944f6c5e (patch) | |
tree | 8b281ed3315699eb0b21f00b5933b6222add5b5a /arch/mips/kernel/irixelf.c | |
parent | 8e2b705649e294f43a8cd1ea79e4c594c0bd1d9d (diff) |
core_pattern: ignore RLIMIT_CORE if core_pattern is a pipe
For some time /proc/sys/kernel/core_pattern has been able to set its output
destination as a pipe, allowing a user space helper to receive and
intellegently process a core. This infrastructure however has some
shortcommings which can be enhanced. Specifically:
1) The coredump code in the kernel should ignore RLIMIT_CORE limitation
when core_pattern is a pipe, since file system resources are not being
consumed in this case, unless the user application wishes to save the core,
at which point the app is restricted by usual file system limits and
restrictions.
2) The core_pattern code should be able to parse and pass options to the
user space helper as an argv array. The real core limit of the uid of the
crashing proces should also be passable to the user space helper (since it
is overridden to zero when called).
3) Some miscellaneous bugs need to be cleaned up (specifically the
recognition of a recursive core dump, should the user mode helper itself
crash. Also, the core dump code in the kernel should not wait for the user
mode helper to exit, since the same context is responsible for writing to
the pipe, and a read of the pipe by the user mode helper will result in a
deadlock.
This patch:
Remove the check of RLIMIT_CORE if core_pattern is a pipe. In the event that
core_pattern is a pipe, the entire core will be fed to the user mode helper.
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>
Diffstat (limited to 'arch/mips/kernel/irixelf.c')
-rw-r--r-- | arch/mips/kernel/irixelf.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c index 5a3fe43e3019..b997af713eb3 100644 --- a/arch/mips/kernel/irixelf.c +++ b/arch/mips/kernel/irixelf.c | |||
@@ -44,7 +44,7 @@ | |||
44 | static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs); | 44 | static int load_irix_binary(struct linux_binprm * bprm, struct pt_regs * regs); |
45 | static int load_irix_library(struct file *); | 45 | static int load_irix_library(struct file *); |
46 | static int irix_core_dump(long signr, struct pt_regs * regs, | 46 | static int irix_core_dump(long signr, struct pt_regs * regs, |
47 | struct file *file); | 47 | struct file *file, unsigned long limit); |
48 | 48 | ||
49 | static struct linux_binfmt irix_format = { | 49 | static struct linux_binfmt irix_format = { |
50 | .module = THIS_MODULE, | 50 | .module = THIS_MODULE, |
@@ -1091,7 +1091,7 @@ end_coredump: | |||
1091 | * and then they are actually written out. If we run out of core limit | 1091 | * and then they are actually written out. If we run out of core limit |
1092 | * we just truncate. | 1092 | * we just truncate. |
1093 | */ | 1093 | */ |
1094 | static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file) | 1094 | static int irix_core_dump(long signr, struct pt_regs *regs, struct file *file, unsigned long limit) |
1095 | { | 1095 | { |
1096 | int has_dumped = 0; | 1096 | int has_dumped = 0; |
1097 | mm_segment_t fs; | 1097 | mm_segment_t fs; |
@@ -1101,7 +1101,6 @@ static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file) | |||
1101 | struct vm_area_struct *vma; | 1101 | struct vm_area_struct *vma; |
1102 | struct elfhdr elf; | 1102 | struct elfhdr elf; |
1103 | off_t offset = 0, dataoff; | 1103 | off_t offset = 0, dataoff; |
1104 | int limit = current->signal->rlim[RLIMIT_CORE].rlim_cur; | ||
1105 | int numnote = 3; | 1104 | int numnote = 3; |
1106 | struct memelfnote notes[3]; | 1105 | struct memelfnote notes[3]; |
1107 | struct elf_prstatus prstatus; /* NT_PRSTATUS */ | 1106 | struct elf_prstatus prstatus; /* NT_PRSTATUS */ |