|
10 | 10 | #include <linux/nsproxy.h>
|
11 | 11 | #include <linux/sysctl.h>
|
12 | 12 | #include <linux/uaccess.h>
|
| 13 | +#include <linux/capability.h> |
13 | 14 | #include <linux/ipc_namespace.h>
|
14 | 15 | #include <linux/msg.h>
|
15 | 16 | #include "util.h"
|
@@ -104,13 +105,29 @@ static int proc_ipc_sem_dointvec(struct ctl_table *table, int write,
|
104 | 105 | return ret;
|
105 | 106 | }
|
106 | 107 |
|
| 108 | +#ifdef CONFIG_CHECKPOINT_RESTORE |
| 109 | +static int proc_ipc_dointvec_minmax_checkpoint_restore(struct ctl_table *table, |
| 110 | + int write, void *buffer, size_t *lenp, loff_t *ppos) |
| 111 | +{ |
| 112 | + struct user_namespace *user_ns = current->nsproxy->ipc_ns->user_ns; |
| 113 | + |
| 114 | + if (write && !checkpoint_restore_ns_capable(user_ns)) |
| 115 | + return -EPERM; |
| 116 | + |
| 117 | + return proc_ipc_dointvec_minmax(table, write, buffer, lenp, ppos); |
| 118 | +} |
| 119 | +#endif |
| 120 | + |
107 | 121 | #else
|
108 | 122 | #define proc_ipc_doulongvec_minmax NULL
|
109 | 123 | #define proc_ipc_dointvec NULL
|
110 | 124 | #define proc_ipc_dointvec_minmax NULL
|
111 | 125 | #define proc_ipc_dointvec_minmax_orphans NULL
|
112 | 126 | #define proc_ipc_auto_msgmni NULL
|
113 | 127 | #define proc_ipc_sem_dointvec NULL
|
| 128 | +#ifdef CONFIG_CHECKPOINT_RESTORE |
| 129 | +#define proc_ipc_dointvec_minmax_checkpoint_restore NULL |
| 130 | +#endif /* CONFIG_CHECKPOINT_RESTORE */ |
114 | 131 | #endif
|
115 | 132 |
|
116 | 133 | int ipc_mni = IPCMNI;
|
@@ -198,26 +215,26 @@ static struct ctl_table ipc_kern_table[] = {
|
198 | 215 | .procname = "sem_next_id",
|
199 | 216 | .data = &init_ipc_ns.ids[IPC_SEM_IDS].next_id,
|
200 | 217 | .maxlen = sizeof(init_ipc_ns.ids[IPC_SEM_IDS].next_id),
|
201 |
| - .mode = 0644, |
202 |
| - .proc_handler = proc_ipc_dointvec_minmax, |
| 218 | + .mode = 0666, |
| 219 | + .proc_handler = proc_ipc_dointvec_minmax_checkpoint_restore, |
203 | 220 | .extra1 = SYSCTL_ZERO,
|
204 | 221 | .extra2 = SYSCTL_INT_MAX,
|
205 | 222 | },
|
206 | 223 | {
|
207 | 224 | .procname = "msg_next_id",
|
208 | 225 | .data = &init_ipc_ns.ids[IPC_MSG_IDS].next_id,
|
209 | 226 | .maxlen = sizeof(init_ipc_ns.ids[IPC_MSG_IDS].next_id),
|
210 |
| - .mode = 0644, |
211 |
| - .proc_handler = proc_ipc_dointvec_minmax, |
| 227 | + .mode = 0666, |
| 228 | + .proc_handler = proc_ipc_dointvec_minmax_checkpoint_restore, |
212 | 229 | .extra1 = SYSCTL_ZERO,
|
213 | 230 | .extra2 = SYSCTL_INT_MAX,
|
214 | 231 | },
|
215 | 232 | {
|
216 | 233 | .procname = "shm_next_id",
|
217 | 234 | .data = &init_ipc_ns.ids[IPC_SHM_IDS].next_id,
|
218 | 235 | .maxlen = sizeof(init_ipc_ns.ids[IPC_SHM_IDS].next_id),
|
219 |
| - .mode = 0644, |
220 |
| - .proc_handler = proc_ipc_dointvec_minmax, |
| 236 | + .mode = 0666, |
| 237 | + .proc_handler = proc_ipc_dointvec_minmax_checkpoint_restore, |
221 | 238 | .extra1 = SYSCTL_ZERO,
|
222 | 239 | .extra2 = SYSCTL_INT_MAX,
|
223 | 240 | },
|
|
0 commit comments