diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-12-08 05:39:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-08 11:29:03 -0500 |
commit | 6b49a257850fb8ad91f4c76bb712e9213141a34a (patch) | |
tree | 5616780832c9f13c5f21e785052c4583a180490c /kernel/sysctl.c | |
parent | 9bc9a6bd3cf559bffe962c51efb062e8b5270ca9 (diff) |
[PATCH] sysctl: fix sys_sysctl interface of ipc sysctls
Currently there is a regression and the ipc sysctls don't show up in the
binary sysctl namespace.
This patch adds sysctl_ipc_data to read data/write from the appropriate
namespace and deliver it in the expected manner.
[akpm@osdl.org: warning fix]
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 10474a63a111..025fcb3c66f8 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -143,6 +143,12 @@ static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | |||
143 | void __user *oldval, size_t __user *oldlenp, | 143 | void __user *oldval, size_t __user *oldlenp, |
144 | void __user *newval, size_t newlen, void **context); | 144 | void __user *newval, size_t newlen, void **context); |
145 | 145 | ||
146 | #ifdef CONFIG_SYSVIPC | ||
147 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, | ||
148 | void __user *oldval, size_t __user *oldlenp, | ||
149 | void __user *newval, size_t newlen, void **context); | ||
150 | #endif | ||
151 | |||
146 | #ifdef CONFIG_PROC_SYSCTL | 152 | #ifdef CONFIG_PROC_SYSCTL |
147 | static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, | 153 | static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, |
148 | void __user *buffer, size_t *lenp, loff_t *ppos); | 154 | void __user *buffer, size_t *lenp, loff_t *ppos); |
@@ -476,6 +482,7 @@ static ctl_table kern_table[] = { | |||
476 | .maxlen = sizeof (init_ipc_ns.shm_ctlmax), | 482 | .maxlen = sizeof (init_ipc_ns.shm_ctlmax), |
477 | .mode = 0644, | 483 | .mode = 0644, |
478 | .proc_handler = &proc_ipc_doulongvec_minmax, | 484 | .proc_handler = &proc_ipc_doulongvec_minmax, |
485 | .strategy = sysctl_ipc_data, | ||
479 | }, | 486 | }, |
480 | { | 487 | { |
481 | .ctl_name = KERN_SHMALL, | 488 | .ctl_name = KERN_SHMALL, |
@@ -484,6 +491,7 @@ static ctl_table kern_table[] = { | |||
484 | .maxlen = sizeof (init_ipc_ns.shm_ctlall), | 491 | .maxlen = sizeof (init_ipc_ns.shm_ctlall), |
485 | .mode = 0644, | 492 | .mode = 0644, |
486 | .proc_handler = &proc_ipc_doulongvec_minmax, | 493 | .proc_handler = &proc_ipc_doulongvec_minmax, |
494 | .strategy = sysctl_ipc_data, | ||
487 | }, | 495 | }, |
488 | { | 496 | { |
489 | .ctl_name = KERN_SHMMNI, | 497 | .ctl_name = KERN_SHMMNI, |
@@ -492,6 +500,7 @@ static ctl_table kern_table[] = { | |||
492 | .maxlen = sizeof (init_ipc_ns.shm_ctlmni), | 500 | .maxlen = sizeof (init_ipc_ns.shm_ctlmni), |
493 | .mode = 0644, | 501 | .mode = 0644, |
494 | .proc_handler = &proc_ipc_dointvec, | 502 | .proc_handler = &proc_ipc_dointvec, |
503 | .strategy = sysctl_ipc_data, | ||
495 | }, | 504 | }, |
496 | { | 505 | { |
497 | .ctl_name = KERN_MSGMAX, | 506 | .ctl_name = KERN_MSGMAX, |
@@ -500,6 +509,7 @@ static ctl_table kern_table[] = { | |||
500 | .maxlen = sizeof (init_ipc_ns.msg_ctlmax), | 509 | .maxlen = sizeof (init_ipc_ns.msg_ctlmax), |
501 | .mode = 0644, | 510 | .mode = 0644, |
502 | .proc_handler = &proc_ipc_dointvec, | 511 | .proc_handler = &proc_ipc_dointvec, |
512 | .strategy = sysctl_ipc_data, | ||
503 | }, | 513 | }, |
504 | { | 514 | { |
505 | .ctl_name = KERN_MSGMNI, | 515 | .ctl_name = KERN_MSGMNI, |
@@ -508,6 +518,7 @@ static ctl_table kern_table[] = { | |||
508 | .maxlen = sizeof (init_ipc_ns.msg_ctlmni), | 518 | .maxlen = sizeof (init_ipc_ns.msg_ctlmni), |
509 | .mode = 0644, | 519 | .mode = 0644, |
510 | .proc_handler = &proc_ipc_dointvec, | 520 | .proc_handler = &proc_ipc_dointvec, |
521 | .strategy = sysctl_ipc_data, | ||
511 | }, | 522 | }, |
512 | { | 523 | { |
513 | .ctl_name = KERN_MSGMNB, | 524 | .ctl_name = KERN_MSGMNB, |
@@ -516,6 +527,7 @@ static ctl_table kern_table[] = { | |||
516 | .maxlen = sizeof (init_ipc_ns.msg_ctlmnb), | 527 | .maxlen = sizeof (init_ipc_ns.msg_ctlmnb), |
517 | .mode = 0644, | 528 | .mode = 0644, |
518 | .proc_handler = &proc_ipc_dointvec, | 529 | .proc_handler = &proc_ipc_dointvec, |
530 | .strategy = sysctl_ipc_data, | ||
519 | }, | 531 | }, |
520 | { | 532 | { |
521 | .ctl_name = KERN_SEM, | 533 | .ctl_name = KERN_SEM, |
@@ -524,6 +536,7 @@ static ctl_table kern_table[] = { | |||
524 | .maxlen = 4*sizeof (int), | 536 | .maxlen = 4*sizeof (int), |
525 | .mode = 0644, | 537 | .mode = 0644, |
526 | .proc_handler = &proc_ipc_dointvec, | 538 | .proc_handler = &proc_ipc_dointvec, |
539 | .strategy = sysctl_ipc_data, | ||
527 | }, | 540 | }, |
528 | #endif | 541 | #endif |
529 | #ifdef CONFIG_MAGIC_SYSRQ | 542 | #ifdef CONFIG_MAGIC_SYSRQ |
@@ -2611,6 +2624,47 @@ static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | |||
2611 | return r; | 2624 | return r; |
2612 | } | 2625 | } |
2613 | 2626 | ||
2627 | #ifdef CONFIG_SYSVIPC | ||
2628 | /* The generic sysctl ipc data routine. */ | ||
2629 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, | ||
2630 | void __user *oldval, size_t __user *oldlenp, | ||
2631 | void __user *newval, size_t newlen, void **context) | ||
2632 | { | ||
2633 | size_t len; | ||
2634 | void *data; | ||
2635 | |||
2636 | /* Get out of I don't have a variable */ | ||
2637 | if (!table->data || !table->maxlen) | ||
2638 | return -ENOTDIR; | ||
2639 | |||
2640 | data = get_ipc(table, 1); | ||
2641 | if (!data) | ||
2642 | return -ENOTDIR; | ||
2643 | |||
2644 | if (oldval && oldlenp) { | ||
2645 | if (get_user(len, oldlenp)) | ||
2646 | return -EFAULT; | ||
2647 | if (len) { | ||
2648 | if (len > table->maxlen) | ||
2649 | len = table->maxlen; | ||
2650 | if (copy_to_user(oldval, data, len)) | ||
2651 | return -EFAULT; | ||
2652 | if (put_user(len, oldlenp)) | ||
2653 | return -EFAULT; | ||
2654 | } | ||
2655 | } | ||
2656 | |||
2657 | if (newval && newlen) { | ||
2658 | if (newlen > table->maxlen) | ||
2659 | newlen = table->maxlen; | ||
2660 | |||
2661 | if (copy_from_user(data, newval, newlen)) | ||
2662 | return -EFAULT; | ||
2663 | } | ||
2664 | return 1; | ||
2665 | } | ||
2666 | #endif | ||
2667 | |||
2614 | #else /* CONFIG_SYSCTL_SYSCALL */ | 2668 | #else /* CONFIG_SYSCTL_SYSCALL */ |
2615 | 2669 | ||
2616 | 2670 | ||
@@ -2681,6 +2735,12 @@ static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen, | |||
2681 | { | 2735 | { |
2682 | return -ENOSYS; | 2736 | return -ENOSYS; |
2683 | } | 2737 | } |
2738 | static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen, | ||
2739 | void __user *oldval, size_t __user *oldlenp, | ||
2740 | void __user *newval, size_t newlen, void **context) | ||
2741 | { | ||
2742 | return -ENOSYS; | ||
2743 | } | ||
2684 | #endif /* CONFIG_SYSCTL_SYSCALL */ | 2744 | #endif /* CONFIG_SYSCTL_SYSCALL */ |
2685 | 2745 | ||
2686 | /* | 2746 | /* |