diff options
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index a79ccf9d113b..8020fb273c4f 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -68,7 +68,6 @@ extern int sysrq_enabled; | |||
68 | extern int core_uses_pid; | 68 | extern int core_uses_pid; |
69 | extern int suid_dumpable; | 69 | extern int suid_dumpable; |
70 | extern char core_pattern[]; | 70 | extern char core_pattern[]; |
71 | extern int cad_pid; | ||
72 | extern int pid_max; | 71 | extern int pid_max; |
73 | extern int min_free_kbytes; | 72 | extern int min_free_kbytes; |
74 | extern int printk_ratelimit_jiffies; | 73 | extern int printk_ratelimit_jiffies; |
@@ -137,6 +136,9 @@ static int parse_table(int __user *, int, void __user *, size_t __user *, | |||
137 | static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, | 136 | static int proc_do_uts_string(ctl_table *table, int write, struct file *filp, |
138 | void __user *buffer, size_t *lenp, loff_t *ppos); | 137 | void __user *buffer, size_t *lenp, loff_t *ppos); |
139 | 138 | ||
139 | static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, | ||
140 | void __user *buffer, size_t *lenp, loff_t *ppos); | ||
141 | |||
140 | static ctl_table root_table[]; | 142 | static ctl_table root_table[]; |
141 | static struct ctl_table_header root_table_header = | 143 | static struct ctl_table_header root_table_header = |
142 | { root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) }; | 144 | { root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) }; |
@@ -543,10 +545,10 @@ static ctl_table kern_table[] = { | |||
543 | { | 545 | { |
544 | .ctl_name = KERN_CADPID, | 546 | .ctl_name = KERN_CADPID, |
545 | .procname = "cad_pid", | 547 | .procname = "cad_pid", |
546 | .data = &cad_pid, | 548 | .data = NULL, |
547 | .maxlen = sizeof (int), | 549 | .maxlen = sizeof (int), |
548 | .mode = 0600, | 550 | .mode = 0600, |
549 | .proc_handler = &proc_dointvec, | 551 | .proc_handler = &proc_do_cad_pid, |
550 | }, | 552 | }, |
551 | { | 553 | { |
552 | .ctl_name = KERN_MAX_THREADS, | 554 | .ctl_name = KERN_MAX_THREADS, |
@@ -2427,6 +2429,28 @@ proc_minmax: | |||
2427 | } | 2429 | } |
2428 | #endif | 2430 | #endif |
2429 | 2431 | ||
2432 | static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, | ||
2433 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
2434 | { | ||
2435 | struct pid *new_pid; | ||
2436 | pid_t tmp; | ||
2437 | int r; | ||
2438 | |||
2439 | tmp = pid_nr(cad_pid); | ||
2440 | |||
2441 | r = __do_proc_dointvec(&tmp, table, write, filp, buffer, | ||
2442 | lenp, ppos, NULL, NULL); | ||
2443 | if (r || !write) | ||
2444 | return r; | ||
2445 | |||
2446 | new_pid = find_get_pid(tmp); | ||
2447 | if (!new_pid) | ||
2448 | return -ESRCH; | ||
2449 | |||
2450 | put_pid(xchg(&cad_pid, new_pid)); | ||
2451 | return 0; | ||
2452 | } | ||
2453 | |||
2430 | #else /* CONFIG_PROC_FS */ | 2454 | #else /* CONFIG_PROC_FS */ |
2431 | 2455 | ||
2432 | int proc_dostring(ctl_table *table, int write, struct file *filp, | 2456 | int proc_dostring(ctl_table *table, int write, struct file *filp, |