|
@@ -129,136 +129,60 @@ static int proc_ipcauto_dointvec_minmax(ctl_table *table, int write,
|
|
#define proc_ipcauto_dointvec_minmax NULL
|
|
#define proc_ipcauto_dointvec_minmax NULL
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#ifdef CONFIG_SYSCTL_SYSCALL
|
|
|
|
-/* The generic sysctl ipc data routine. */
|
|
|
|
-static int sysctl_ipc_data(ctl_table *table,
|
|
|
|
- void __user *oldval, size_t __user *oldlenp,
|
|
|
|
- void __user *newval, size_t newlen)
|
|
|
|
-{
|
|
|
|
- size_t len;
|
|
|
|
- void *data;
|
|
|
|
-
|
|
|
|
- /* Get out of I don't have a variable */
|
|
|
|
- if (!table->data || !table->maxlen)
|
|
|
|
- return -ENOTDIR;
|
|
|
|
-
|
|
|
|
- data = get_ipc(table);
|
|
|
|
- if (!data)
|
|
|
|
- return -ENOTDIR;
|
|
|
|
-
|
|
|
|
- if (oldval && oldlenp) {
|
|
|
|
- if (get_user(len, oldlenp))
|
|
|
|
- return -EFAULT;
|
|
|
|
- if (len) {
|
|
|
|
- if (len > table->maxlen)
|
|
|
|
- len = table->maxlen;
|
|
|
|
- if (copy_to_user(oldval, data, len))
|
|
|
|
- return -EFAULT;
|
|
|
|
- if (put_user(len, oldlenp))
|
|
|
|
- return -EFAULT;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (newval && newlen) {
|
|
|
|
- if (newlen > table->maxlen)
|
|
|
|
- newlen = table->maxlen;
|
|
|
|
-
|
|
|
|
- if (copy_from_user(data, newval, newlen))
|
|
|
|
- return -EFAULT;
|
|
|
|
- }
|
|
|
|
- return 1;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int sysctl_ipc_registered_data(ctl_table *table,
|
|
|
|
- void __user *oldval, size_t __user *oldlenp,
|
|
|
|
- void __user *newval, size_t newlen)
|
|
|
|
-{
|
|
|
|
- int rc;
|
|
|
|
-
|
|
|
|
- rc = sysctl_ipc_data(table, oldval, oldlenp, newval, newlen);
|
|
|
|
-
|
|
|
|
- if (newval && newlen && rc > 0)
|
|
|
|
- /*
|
|
|
|
- * Tunable has successfully been changed from userland
|
|
|
|
- */
|
|
|
|
- unregister_ipcns_notifier(current->nsproxy->ipc_ns);
|
|
|
|
-
|
|
|
|
- return rc;
|
|
|
|
-}
|
|
|
|
-#else
|
|
|
|
-#define sysctl_ipc_data NULL
|
|
|
|
-#define sysctl_ipc_registered_data NULL
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
static int zero;
|
|
static int zero;
|
|
static int one = 1;
|
|
static int one = 1;
|
|
|
|
|
|
static struct ctl_table ipc_kern_table[] = {
|
|
static struct ctl_table ipc_kern_table[] = {
|
|
{
|
|
{
|
|
- .ctl_name = KERN_SHMMAX,
|
|
|
|
.procname = "shmmax",
|
|
.procname = "shmmax",
|
|
.data = &init_ipc_ns.shm_ctlmax,
|
|
.data = &init_ipc_ns.shm_ctlmax,
|
|
.maxlen = sizeof (init_ipc_ns.shm_ctlmax),
|
|
.maxlen = sizeof (init_ipc_ns.shm_ctlmax),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_doulongvec_minmax,
|
|
.proc_handler = proc_ipc_doulongvec_minmax,
|
|
- .strategy = sysctl_ipc_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = KERN_SHMALL,
|
|
|
|
.procname = "shmall",
|
|
.procname = "shmall",
|
|
.data = &init_ipc_ns.shm_ctlall,
|
|
.data = &init_ipc_ns.shm_ctlall,
|
|
.maxlen = sizeof (init_ipc_ns.shm_ctlall),
|
|
.maxlen = sizeof (init_ipc_ns.shm_ctlall),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_doulongvec_minmax,
|
|
.proc_handler = proc_ipc_doulongvec_minmax,
|
|
- .strategy = sysctl_ipc_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = KERN_SHMMNI,
|
|
|
|
.procname = "shmmni",
|
|
.procname = "shmmni",
|
|
.data = &init_ipc_ns.shm_ctlmni,
|
|
.data = &init_ipc_ns.shm_ctlmni,
|
|
.maxlen = sizeof (init_ipc_ns.shm_ctlmni),
|
|
.maxlen = sizeof (init_ipc_ns.shm_ctlmni),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
- .strategy = sysctl_ipc_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = KERN_MSGMAX,
|
|
|
|
.procname = "msgmax",
|
|
.procname = "msgmax",
|
|
.data = &init_ipc_ns.msg_ctlmax,
|
|
.data = &init_ipc_ns.msg_ctlmax,
|
|
.maxlen = sizeof (init_ipc_ns.msg_ctlmax),
|
|
.maxlen = sizeof (init_ipc_ns.msg_ctlmax),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
- .strategy = sysctl_ipc_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = KERN_MSGMNI,
|
|
|
|
.procname = "msgmni",
|
|
.procname = "msgmni",
|
|
.data = &init_ipc_ns.msg_ctlmni,
|
|
.data = &init_ipc_ns.msg_ctlmni,
|
|
.maxlen = sizeof (init_ipc_ns.msg_ctlmni),
|
|
.maxlen = sizeof (init_ipc_ns.msg_ctlmni),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_callback_dointvec,
|
|
.proc_handler = proc_ipc_callback_dointvec,
|
|
- .strategy = sysctl_ipc_registered_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = KERN_MSGMNB,
|
|
|
|
.procname = "msgmnb",
|
|
.procname = "msgmnb",
|
|
.data = &init_ipc_ns.msg_ctlmnb,
|
|
.data = &init_ipc_ns.msg_ctlmnb,
|
|
.maxlen = sizeof (init_ipc_ns.msg_ctlmnb),
|
|
.maxlen = sizeof (init_ipc_ns.msg_ctlmnb),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
- .strategy = sysctl_ipc_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = KERN_SEM,
|
|
|
|
.procname = "sem",
|
|
.procname = "sem",
|
|
.data = &init_ipc_ns.sem_ctls,
|
|
.data = &init_ipc_ns.sem_ctls,
|
|
.maxlen = 4*sizeof (int),
|
|
.maxlen = 4*sizeof (int),
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
- .strategy = sysctl_ipc_data,
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- .ctl_name = CTL_UNNUMBERED,
|
|
|
|
.procname = "auto_msgmni",
|
|
.procname = "auto_msgmni",
|
|
.data = &init_ipc_ns.auto_msgmni,
|
|
.data = &init_ipc_ns.auto_msgmni,
|
|
.maxlen = sizeof(int),
|
|
.maxlen = sizeof(int),
|
|
@@ -272,7 +196,6 @@ static struct ctl_table ipc_kern_table[] = {
|
|
|
|
|
|
static struct ctl_table ipc_root_table[] = {
|
|
static struct ctl_table ipc_root_table[] = {
|
|
{
|
|
{
|
|
- .ctl_name = CTL_KERN,
|
|
|
|
.procname = "kernel",
|
|
.procname = "kernel",
|
|
.mode = 0555,
|
|
.mode = 0555,
|
|
.child = ipc_kern_table,
|
|
.child = ipc_kern_table,
|