diff options
-rw-r--r-- | ipc/msg.c | 14 | ||||
-rw-r--r-- | ipc/sem.c | 23 | ||||
-rw-r--r-- | ipc/shm.c | 23 | ||||
-rw-r--r-- | ipc/util.h | 4 |
4 files changed, 46 insertions, 18 deletions
@@ -138,13 +138,17 @@ void __init msg_init(void) | |||
138 | 138 | ||
139 | static inline struct msg_queue *msg_lock(struct ipc_namespace *ns, int id) | 139 | static inline struct msg_queue *msg_lock(struct ipc_namespace *ns, int id) |
140 | { | 140 | { |
141 | return (struct msg_queue *) ipc_lock(&msg_ids(ns), id); | 141 | struct kern_ipc_perm *ipcp = ipc_lock(&msg_ids(ns), id); |
142 | |||
143 | return container_of(ipcp, struct msg_queue, q_perm); | ||
142 | } | 144 | } |
143 | 145 | ||
144 | static inline struct msg_queue *msg_lock_check(struct ipc_namespace *ns, | 146 | static inline struct msg_queue *msg_lock_check(struct ipc_namespace *ns, |
145 | int id) | 147 | int id) |
146 | { | 148 | { |
147 | return (struct msg_queue *) ipc_lock_check(&msg_ids(ns), id); | 149 | struct kern_ipc_perm *ipcp = ipc_lock_check(&msg_ids(ns), id); |
150 | |||
151 | return container_of(ipcp, struct msg_queue, q_perm); | ||
148 | } | 152 | } |
149 | 153 | ||
150 | static inline void msg_rmid(struct ipc_namespace *ns, struct msg_queue *s) | 154 | static inline void msg_rmid(struct ipc_namespace *ns, struct msg_queue *s) |
@@ -274,9 +278,11 @@ static void freeque(struct ipc_namespace *ns, struct msg_queue *msq) | |||
274 | ipc_rcu_putref(msq); | 278 | ipc_rcu_putref(msq); |
275 | } | 279 | } |
276 | 280 | ||
277 | static inline int msg_security(void *msq, int msgflg) | 281 | static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg) |
278 | { | 282 | { |
279 | return security_msg_queue_associate((struct msg_queue *) msq, msgflg); | 283 | struct msg_queue *msq = container_of(ipcp, struct msg_queue, q_perm); |
284 | |||
285 | return security_msg_queue_associate(msq, msgflg); | ||
280 | } | 286 | } |
281 | 287 | ||
282 | asmlinkage long sys_msgget(key_t key, int msgflg) | 288 | asmlinkage long sys_msgget(key_t key, int msgflg) |
@@ -176,13 +176,17 @@ void __init sem_init (void) | |||
176 | 176 | ||
177 | static inline struct sem_array *sem_lock(struct ipc_namespace *ns, int id) | 177 | static inline struct sem_array *sem_lock(struct ipc_namespace *ns, int id) |
178 | { | 178 | { |
179 | return (struct sem_array *) ipc_lock(&sem_ids(ns), id); | 179 | struct kern_ipc_perm *ipcp = ipc_lock(&sem_ids(ns), id); |
180 | |||
181 | return container_of(ipcp, struct sem_array, sem_perm); | ||
180 | } | 182 | } |
181 | 183 | ||
182 | static inline struct sem_array *sem_lock_check(struct ipc_namespace *ns, | 184 | static inline struct sem_array *sem_lock_check(struct ipc_namespace *ns, |
183 | int id) | 185 | int id) |
184 | { | 186 | { |
185 | return (struct sem_array *) ipc_lock_check(&sem_ids(ns), id); | 187 | struct kern_ipc_perm *ipcp = ipc_lock_check(&sem_ids(ns), id); |
188 | |||
189 | return container_of(ipcp, struct sem_array, sem_perm); | ||
186 | } | 190 | } |
187 | 191 | ||
188 | static inline void sem_rmid(struct ipc_namespace *ns, struct sem_array *s) | 192 | static inline void sem_rmid(struct ipc_namespace *ns, struct sem_array *s) |
@@ -277,14 +281,21 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params) | |||
277 | } | 281 | } |
278 | 282 | ||
279 | 283 | ||
280 | static inline int sem_security(void *sma, int semflg) | 284 | static inline int sem_security(struct kern_ipc_perm *ipcp, int semflg) |
281 | { | 285 | { |
282 | return security_sem_associate((struct sem_array *) sma, semflg); | 286 | struct sem_array *sma; |
287 | |||
288 | sma = container_of(ipcp, struct sem_array, sem_perm); | ||
289 | return security_sem_associate(sma, semflg); | ||
283 | } | 290 | } |
284 | 291 | ||
285 | static inline int sem_more_checks(void *sma, struct ipc_params *params) | 292 | static inline int sem_more_checks(struct kern_ipc_perm *ipcp, |
293 | struct ipc_params *params) | ||
286 | { | 294 | { |
287 | if (params->u.nsems > ((struct sem_array *)sma)->sem_nsems) | 295 | struct sem_array *sma; |
296 | |||
297 | sma = container_of(ipcp, struct sem_array, sem_perm); | ||
298 | if (params->u.nsems > sma->sem_nsems) | ||
288 | return -EINVAL; | 299 | return -EINVAL; |
289 | 300 | ||
290 | return 0; | 301 | return 0; |
@@ -139,13 +139,17 @@ void __init shm_init (void) | |||
139 | 139 | ||
140 | static inline struct shmid_kernel *shm_lock(struct ipc_namespace *ns, int id) | 140 | static inline struct shmid_kernel *shm_lock(struct ipc_namespace *ns, int id) |
141 | { | 141 | { |
142 | return (struct shmid_kernel *) ipc_lock(&shm_ids(ns), id); | 142 | struct kern_ipc_perm *ipcp = ipc_lock(&shm_ids(ns), id); |
143 | |||
144 | return container_of(ipcp, struct shmid_kernel, shm_perm); | ||
143 | } | 145 | } |
144 | 146 | ||
145 | static inline struct shmid_kernel *shm_lock_check(struct ipc_namespace *ns, | 147 | static inline struct shmid_kernel *shm_lock_check(struct ipc_namespace *ns, |
146 | int id) | 148 | int id) |
147 | { | 149 | { |
148 | return (struct shmid_kernel *) ipc_lock_check(&shm_ids(ns), id); | 150 | struct kern_ipc_perm *ipcp = ipc_lock_check(&shm_ids(ns), id); |
151 | |||
152 | return container_of(ipcp, struct shmid_kernel, shm_perm); | ||
149 | } | 153 | } |
150 | 154 | ||
151 | static inline void shm_rmid(struct ipc_namespace *ns, struct shmid_kernel *s) | 155 | static inline void shm_rmid(struct ipc_namespace *ns, struct shmid_kernel *s) |
@@ -424,14 +428,21 @@ no_file: | |||
424 | return error; | 428 | return error; |
425 | } | 429 | } |
426 | 430 | ||
427 | static inline int shm_security(void *shp, int shmflg) | 431 | static inline int shm_security(struct kern_ipc_perm *ipcp, int shmflg) |
428 | { | 432 | { |
429 | return security_shm_associate((struct shmid_kernel *) shp, shmflg); | 433 | struct shmid_kernel *shp; |
434 | |||
435 | shp = container_of(ipcp, struct shmid_kernel, shm_perm); | ||
436 | return security_shm_associate(shp, shmflg); | ||
430 | } | 437 | } |
431 | 438 | ||
432 | static inline int shm_more_checks(void *shp, struct ipc_params *params) | 439 | static inline int shm_more_checks(struct kern_ipc_perm *ipcp, |
440 | struct ipc_params *params) | ||
433 | { | 441 | { |
434 | if (((struct shmid_kernel *)shp)->shm_segsz < params->u.size) | 442 | struct shmid_kernel *shp; |
443 | |||
444 | shp = container_of(ipcp, struct shmid_kernel, shm_perm); | ||
445 | if (shp->shm_segsz < params->u.size) | ||
435 | return -EINVAL; | 446 | return -EINVAL; |
436 | 447 | ||
437 | return 0; | 448 | return 0; |
diff --git a/ipc/util.h b/ipc/util.h index c4b0a9865bf5..2a03d8cc6a01 100644 --- a/ipc/util.h +++ b/ipc/util.h | |||
@@ -61,8 +61,8 @@ struct ipc_params { | |||
61 | */ | 61 | */ |
62 | struct ipc_ops { | 62 | struct ipc_ops { |
63 | int (*getnew) (struct ipc_namespace *, struct ipc_params *); | 63 | int (*getnew) (struct ipc_namespace *, struct ipc_params *); |
64 | int (*associate) (void *, int); | 64 | int (*associate) (struct kern_ipc_perm *, int); |
65 | int (*more_checks) (void *, struct ipc_params *); | 65 | int (*more_checks) (struct kern_ipc_perm *, struct ipc_params *); |
66 | }; | 66 | }; |
67 | 67 | ||
68 | struct seq_file; | 68 | struct seq_file; |