|
@@ -31,12 +31,37 @@ static int proc_ipc_dointvec(ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
{
|
|
struct ctl_table ipc_table;
|
|
struct ctl_table ipc_table;
|
|
|
|
+
|
|
memcpy(&ipc_table, table, sizeof(ipc_table));
|
|
memcpy(&ipc_table, table, sizeof(ipc_table));
|
|
ipc_table.data = get_ipc(table);
|
|
ipc_table.data = get_ipc(table);
|
|
|
|
|
|
return proc_dointvec(&ipc_table, write, buffer, lenp, ppos);
|
|
return proc_dointvec(&ipc_table, write, buffer, lenp, ppos);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int proc_ipc_dointvec_minmax(ctl_table *table, int write,
|
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
|
+{
|
|
|
|
+ struct ctl_table ipc_table;
|
|
|
|
+
|
|
|
|
+ memcpy(&ipc_table, table, sizeof(ipc_table));
|
|
|
|
+ ipc_table.data = get_ipc(table);
|
|
|
|
+
|
|
|
|
+ return proc_dointvec_minmax(&ipc_table, write, buffer, lenp, ppos);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int proc_ipc_dointvec_minmax_orphans(ctl_table *table, int write,
|
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
|
+{
|
|
|
|
+ struct ipc_namespace *ns = current->nsproxy->ipc_ns;
|
|
|
|
+ int err = proc_ipc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
|
|
|
+
|
|
|
|
+ if (err < 0)
|
|
|
|
+ return err;
|
|
|
|
+ if (ns->shm_rmid_forced)
|
|
|
|
+ shm_destroy_orphaned(ns);
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
static int proc_ipc_callback_dointvec(ctl_table *table, int write,
|
|
static int proc_ipc_callback_dointvec(ctl_table *table, int write,
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
{
|
|
{
|
|
@@ -125,6 +150,8 @@ static int proc_ipcauto_dointvec_minmax(ctl_table *table, int write,
|
|
#else
|
|
#else
|
|
#define proc_ipc_doulongvec_minmax NULL
|
|
#define proc_ipc_doulongvec_minmax NULL
|
|
#define proc_ipc_dointvec NULL
|
|
#define proc_ipc_dointvec NULL
|
|
|
|
+#define proc_ipc_dointvec_minmax NULL
|
|
|
|
+#define proc_ipc_dointvec_minmax_orphans NULL
|
|
#define proc_ipc_callback_dointvec NULL
|
|
#define proc_ipc_callback_dointvec NULL
|
|
#define proc_ipcauto_dointvec_minmax NULL
|
|
#define proc_ipcauto_dointvec_minmax NULL
|
|
#endif
|
|
#endif
|
|
@@ -154,6 +181,15 @@ static struct ctl_table ipc_kern_table[] = {
|
|
.mode = 0644,
|
|
.mode = 0644,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
.proc_handler = proc_ipc_dointvec,
|
|
},
|
|
},
|
|
|
|
+ {
|
|
|
|
+ .procname = "shm_rmid_forced",
|
|
|
|
+ .data = &init_ipc_ns.shm_rmid_forced,
|
|
|
|
+ .maxlen = sizeof(init_ipc_ns.shm_rmid_forced),
|
|
|
|
+ .mode = 0644,
|
|
|
|
+ .proc_handler = proc_ipc_dointvec_minmax_orphans,
|
|
|
|
+ .extra1 = &zero,
|
|
|
|
+ .extra2 = &one,
|
|
|
|
+ },
|
|
{
|
|
{
|
|
.procname = "msgmax",
|
|
.procname = "msgmax",
|
|
.data = &init_ipc_ns.msg_ctlmax,
|
|
.data = &init_ipc_ns.msg_ctlmax,
|