aboutsummaryrefslogtreecommitdiffstats
path: root/ipc
diff options
context:
space:
mode:
authorMathias Krause <minipli@googlemail.com>2014-06-06 17:37:36 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-06 19:08:14 -0400
commiteb66ec44f867834de054544b09b573de3a7ae456 (patch)
tree4fabad7ced4ce6145d44e8e25bd6ee111712e9f8 /ipc
parent3e4e0f0a8756dade3023d1f47d50fbced7749788 (diff)
ipc: constify ipc_ops
There is no need to recreate the very same ipc_ops structure on every kernel entry for msgget/semget/shmget. Just declare it static and be done with it. While at it, constify it as we don't modify the structure at runtime. Found in the PaX patch, written by the PaX Team. Signed-off-by: Mathias Krause <minipli@googlemail.com> Cc: PaX Team <pageexec@freemail.hu> Cc: Davidlohr Bueso <davidlohr@hp.com> Cc: Manfred Spraul <manfred@colorfullife.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc')
-rw-r--r--ipc/msg.c9
-rw-r--r--ipc/sem.c10
-rw-r--r--ipc/shm.c10
-rw-r--r--ipc/util.c8
-rw-r--r--ipc/util.h2
5 files changed, 19 insertions, 20 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index 649853105a5d..35e4018de53c 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -306,15 +306,14 @@ static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
306SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg) 306SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
307{ 307{
308 struct ipc_namespace *ns; 308 struct ipc_namespace *ns;
309 struct ipc_ops msg_ops; 309 static const struct ipc_ops msg_ops = {
310 .getnew = newque,
311 .associate = msg_security,
312 };
310 struct ipc_params msg_params; 313 struct ipc_params msg_params;
311 314
312 ns = current->nsproxy->ipc_ns; 315 ns = current->nsproxy->ipc_ns;
313 316
314 msg_ops.getnew = newque;
315 msg_ops.associate = msg_security;
316 msg_ops.more_checks = NULL;
317
318 msg_params.key = key; 317 msg_params.key = key;
319 msg_params.flg = msgflg; 318 msg_params.flg = msgflg;
320 319
diff --git a/ipc/sem.c b/ipc/sem.c
index bee555417312..3fcbc96abee9 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -564,7 +564,11 @@ static inline int sem_more_checks(struct kern_ipc_perm *ipcp,
564SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg) 564SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
565{ 565{
566 struct ipc_namespace *ns; 566 struct ipc_namespace *ns;
567 struct ipc_ops sem_ops; 567 static const struct ipc_ops sem_ops = {
568 .getnew = newary,
569 .associate = sem_security,
570 .more_checks = sem_more_checks,
571 };
568 struct ipc_params sem_params; 572 struct ipc_params sem_params;
569 573
570 ns = current->nsproxy->ipc_ns; 574 ns = current->nsproxy->ipc_ns;
@@ -572,10 +576,6 @@ SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
572 if (nsems < 0 || nsems > ns->sc_semmsl) 576 if (nsems < 0 || nsems > ns->sc_semmsl)
573 return -EINVAL; 577 return -EINVAL;
574 578
575 sem_ops.getnew = newary;
576 sem_ops.associate = sem_security;
577 sem_ops.more_checks = sem_more_checks;
578
579 sem_params.key = key; 579 sem_params.key = key;
580 sem_params.flg = semflg; 580 sem_params.flg = semflg;
581 sem_params.u.nsems = nsems; 581 sem_params.u.nsems = nsems;
diff --git a/ipc/shm.c b/ipc/shm.c
index 76459616a7fa..b54c93f6d117 100644
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -609,15 +609,15 @@ static inline int shm_more_checks(struct kern_ipc_perm *ipcp,
609SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg) 609SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg)
610{ 610{
611 struct ipc_namespace *ns; 611 struct ipc_namespace *ns;
612 struct ipc_ops shm_ops; 612 static const struct ipc_ops shm_ops = {
613 .getnew = newseg,
614 .associate = shm_security,
615 .more_checks = shm_more_checks,
616 };
613 struct ipc_params shm_params; 617 struct ipc_params shm_params;
614 618
615 ns = current->nsproxy->ipc_ns; 619 ns = current->nsproxy->ipc_ns;
616 620
617 shm_ops.getnew = newseg;
618 shm_ops.associate = shm_security;
619 shm_ops.more_checks = shm_more_checks;
620
621 shm_params.key = key; 621 shm_params.key = key;
622 shm_params.flg = shmflg; 622 shm_params.flg = shmflg;
623 shm_params.u.size = size; 623 shm_params.u.size = size;
diff --git a/ipc/util.c b/ipc/util.c
index 2eb0d1eaa312..9b3fa38afe2c 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -317,7 +317,7 @@ int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int size)
317 * when the key is IPC_PRIVATE. 317 * when the key is IPC_PRIVATE.
318 */ 318 */
319static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids, 319static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
320 struct ipc_ops *ops, struct ipc_params *params) 320 const struct ipc_ops *ops, struct ipc_params *params)
321{ 321{
322 int err; 322 int err;
323 323
@@ -344,7 +344,7 @@ static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
344 */ 344 */
345static int ipc_check_perms(struct ipc_namespace *ns, 345static int ipc_check_perms(struct ipc_namespace *ns,
346 struct kern_ipc_perm *ipcp, 346 struct kern_ipc_perm *ipcp,
347 struct ipc_ops *ops, 347 const struct ipc_ops *ops,
348 struct ipc_params *params) 348 struct ipc_params *params)
349{ 349{
350 int err; 350 int err;
@@ -375,7 +375,7 @@ static int ipc_check_perms(struct ipc_namespace *ns,
375 * On success, the ipc id is returned. 375 * On success, the ipc id is returned.
376 */ 376 */
377static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids, 377static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
378 struct ipc_ops *ops, struct ipc_params *params) 378 const struct ipc_ops *ops, struct ipc_params *params)
379{ 379{
380 struct kern_ipc_perm *ipcp; 380 struct kern_ipc_perm *ipcp;
381 int flg = params->flg; 381 int flg = params->flg;
@@ -678,7 +678,7 @@ out:
678 * Common routine called by sys_msgget(), sys_semget() and sys_shmget(). 678 * Common routine called by sys_msgget(), sys_semget() and sys_shmget().
679 */ 679 */
680int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, 680int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
681 struct ipc_ops *ops, struct ipc_params *params) 681 const struct ipc_ops *ops, struct ipc_params *params)
682{ 682{
683 if (params->key == IPC_PRIVATE) 683 if (params->key == IPC_PRIVATE)
684 return ipcget_new(ns, ids, ops, params); 684 return ipcget_new(ns, ids, ops, params);
diff --git a/ipc/util.h b/ipc/util.h
index 9c47d6f6c7b4..e1153ad574b7 100644
--- a/ipc/util.h
+++ b/ipc/util.h
@@ -201,7 +201,7 @@ static inline bool ipc_valid_object(struct kern_ipc_perm *perm)
201 201
202struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id); 202struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id);
203int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids, 203int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
204 struct ipc_ops *ops, struct ipc_params *params); 204 const struct ipc_ops *ops, struct ipc_params *params);
205void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids, 205void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
206 void (*free)(struct ipc_namespace *, struct kern_ipc_perm *)); 206 void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
207#endif 207#endif