diff options
author | Alex Kelly <alex.page.kelly@gmail.com> | 2012-10-04 20:15:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-05 14:05:15 -0400 |
commit | 046d662f481830e652ac34cd112249adde16452a (patch) | |
tree | ad13e968b4b02f9e2c35ce45f358477474df80d7 /kernel/sysctl.c | |
parent | db9aeca97a58563e1ab927d157c9b5048f233e73 (diff) |
coredump: make core dump functionality optional
Adds an expert Kconfig option, CONFIG_COREDUMP, which allows disabling of
core dump. This saves approximately 2.6k in the compiled kernel, and
complements CONFIG_ELF_CORE, which now depends on it.
CONFIG_COREDUMP also disables coredump-related sysctls, except for
suid_dumpable and related functions, which are necessary for ptrace.
[akpm@linux-foundation.org: fix binfmt_aout.c build]
Signed-off-by: Alex Kelly <alex.page.kelly@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Acked-by: Kees Cook <keescook@chromium.org>
Cc: Randy Dunlap <rdunlap@xenotime.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 84c76a34e41c..c2a2f8084bad 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -97,10 +97,12 @@ | |||
97 | extern int sysctl_overcommit_memory; | 97 | extern int sysctl_overcommit_memory; |
98 | extern int sysctl_overcommit_ratio; | 98 | extern int sysctl_overcommit_ratio; |
99 | extern int max_threads; | 99 | extern int max_threads; |
100 | extern int core_uses_pid; | ||
101 | extern int suid_dumpable; | 100 | extern int suid_dumpable; |
101 | #ifdef CONFIG_COREDUMP | ||
102 | extern int core_uses_pid; | ||
102 | extern char core_pattern[]; | 103 | extern char core_pattern[]; |
103 | extern unsigned int core_pipe_limit; | 104 | extern unsigned int core_pipe_limit; |
105 | #endif | ||
104 | extern int pid_max; | 106 | extern int pid_max; |
105 | extern int min_free_kbytes; | 107 | extern int min_free_kbytes; |
106 | extern int pid_max_min, pid_max_max; | 108 | extern int pid_max_min, pid_max_max; |
@@ -177,8 +179,10 @@ static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write, | |||
177 | 179 | ||
178 | static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, | 180 | static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, |
179 | void __user *buffer, size_t *lenp, loff_t *ppos); | 181 | void __user *buffer, size_t *lenp, loff_t *ppos); |
182 | #ifdef CONFIG_COREDUMP | ||
180 | static int proc_dostring_coredump(struct ctl_table *table, int write, | 183 | static int proc_dostring_coredump(struct ctl_table *table, int write, |
181 | void __user *buffer, size_t *lenp, loff_t *ppos); | 184 | void __user *buffer, size_t *lenp, loff_t *ppos); |
185 | #endif | ||
182 | 186 | ||
183 | #ifdef CONFIG_MAGIC_SYSRQ | 187 | #ifdef CONFIG_MAGIC_SYSRQ |
184 | /* Note: sysrq code uses it's own private copy */ | 188 | /* Note: sysrq code uses it's own private copy */ |
@@ -404,6 +408,7 @@ static struct ctl_table kern_table[] = { | |||
404 | .mode = 0644, | 408 | .mode = 0644, |
405 | .proc_handler = proc_dointvec, | 409 | .proc_handler = proc_dointvec, |
406 | }, | 410 | }, |
411 | #ifdef CONFIG_COREDUMP | ||
407 | { | 412 | { |
408 | .procname = "core_uses_pid", | 413 | .procname = "core_uses_pid", |
409 | .data = &core_uses_pid, | 414 | .data = &core_uses_pid, |
@@ -425,6 +430,7 @@ static struct ctl_table kern_table[] = { | |||
425 | .mode = 0644, | 430 | .mode = 0644, |
426 | .proc_handler = proc_dointvec, | 431 | .proc_handler = proc_dointvec, |
427 | }, | 432 | }, |
433 | #endif | ||
428 | #ifdef CONFIG_PROC_SYSCTL | 434 | #ifdef CONFIG_PROC_SYSCTL |
429 | { | 435 | { |
430 | .procname = "tainted", | 436 | .procname = "tainted", |
@@ -2036,12 +2042,14 @@ int proc_dointvec_minmax(struct ctl_table *table, int write, | |||
2036 | 2042 | ||
2037 | static void validate_coredump_safety(void) | 2043 | static void validate_coredump_safety(void) |
2038 | { | 2044 | { |
2045 | #ifdef CONFIG_COREDUMP | ||
2039 | if (suid_dumpable == SUID_DUMPABLE_SAFE && | 2046 | if (suid_dumpable == SUID_DUMPABLE_SAFE && |
2040 | core_pattern[0] != '/' && core_pattern[0] != '|') { | 2047 | core_pattern[0] != '/' && core_pattern[0] != '|') { |
2041 | printk(KERN_WARNING "Unsafe core_pattern used with "\ | 2048 | printk(KERN_WARNING "Unsafe core_pattern used with "\ |
2042 | "suid_dumpable=2. Pipe handler or fully qualified "\ | 2049 | "suid_dumpable=2. Pipe handler or fully qualified "\ |
2043 | "core dump path required.\n"); | 2050 | "core dump path required.\n"); |
2044 | } | 2051 | } |
2052 | #endif | ||
2045 | } | 2053 | } |
2046 | 2054 | ||
2047 | static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, | 2055 | static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, |
@@ -2053,6 +2061,7 @@ static int proc_dointvec_minmax_coredump(struct ctl_table *table, int write, | |||
2053 | return error; | 2061 | return error; |
2054 | } | 2062 | } |
2055 | 2063 | ||
2064 | #ifdef CONFIG_COREDUMP | ||
2056 | static int proc_dostring_coredump(struct ctl_table *table, int write, | 2065 | static int proc_dostring_coredump(struct ctl_table *table, int write, |
2057 | void __user *buffer, size_t *lenp, loff_t *ppos) | 2066 | void __user *buffer, size_t *lenp, loff_t *ppos) |
2058 | { | 2067 | { |
@@ -2061,6 +2070,7 @@ static int proc_dostring_coredump(struct ctl_table *table, int write, | |||
2061 | validate_coredump_safety(); | 2070 | validate_coredump_safety(); |
2062 | return error; | 2071 | return error; |
2063 | } | 2072 | } |
2073 | #endif | ||
2064 | 2074 | ||
2065 | static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, | 2075 | static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, int write, |
2066 | void __user *buffer, | 2076 | void __user *buffer, |