ipc: constify ipc_ops
authorMathias Krause <minipli@googlemail.com>
Fri, 6 Jun 2014 21:37:36 +0000 (14:37 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Jun 2014 23:08:14 +0000 (16:08 -0700)
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>
ipc/msg.c
ipc/sem.c
ipc/shm.c
ipc/util.c
ipc/util.h

index 649853105a5d773d30fac9929327030cad118a67..35e4018de53c3434a74d6c99e569f1a1c1a574e7 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -306,15 +306,14 @@ static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
 SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
 {
        struct ipc_namespace *ns;
-       struct ipc_ops msg_ops;
+       static const struct ipc_ops msg_ops = {
+               .getnew = newque,
+               .associate = msg_security,
+       };
        struct ipc_params msg_params;
 
        ns = current->nsproxy->ipc_ns;
 
-       msg_ops.getnew = newque;
-       msg_ops.associate = msg_security;
-       msg_ops.more_checks = NULL;
-
        msg_params.key = key;
        msg_params.flg = msgflg;
 
index bee5554173120780374e6b42228d13c786ceb315..3fcbc96abee9d75ee354974f7f025f88996bccfc 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -564,7 +564,11 @@ static inline int sem_more_checks(struct kern_ipc_perm *ipcp,
 SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
 {
        struct ipc_namespace *ns;
-       struct ipc_ops sem_ops;
+       static const struct ipc_ops sem_ops = {
+               .getnew = newary,
+               .associate = sem_security,
+               .more_checks = sem_more_checks,
+       };
        struct ipc_params sem_params;
 
        ns = current->nsproxy->ipc_ns;
@@ -572,10 +576,6 @@ SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
        if (nsems < 0 || nsems > ns->sc_semmsl)
                return -EINVAL;
 
-       sem_ops.getnew = newary;
-       sem_ops.associate = sem_security;
-       sem_ops.more_checks = sem_more_checks;
-
        sem_params.key = key;
        sem_params.flg = semflg;
        sem_params.u.nsems = nsems;
index 76459616a7fafe7581d713a245c63e861a4cf631..b54c93f6d117aa869dc98d8b44b5f2618d7c935c 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -609,15 +609,15 @@ static inline int shm_more_checks(struct kern_ipc_perm *ipcp,
 SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg)
 {
        struct ipc_namespace *ns;
-       struct ipc_ops shm_ops;
+       static const struct ipc_ops shm_ops = {
+               .getnew = newseg,
+               .associate = shm_security,
+               .more_checks = shm_more_checks,
+       };
        struct ipc_params shm_params;
 
        ns = current->nsproxy->ipc_ns;
 
-       shm_ops.getnew = newseg;
-       shm_ops.associate = shm_security;
-       shm_ops.more_checks = shm_more_checks;
-
        shm_params.key = key;
        shm_params.flg = shmflg;
        shm_params.u.size = size;
index 2eb0d1eaa312d9e0deda1faec271ea3bf55f8180..9b3fa38afe2c6ed1217c89cc9ceda7ca20c11774 100644 (file)
@@ -317,7 +317,7 @@ int ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int size)
  * when the key is IPC_PRIVATE.
  */
 static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
-               struct ipc_ops *ops, struct ipc_params *params)
+               const struct ipc_ops *ops, struct ipc_params *params)
 {
        int err;
 
@@ -344,7 +344,7 @@ static int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
  */
 static int ipc_check_perms(struct ipc_namespace *ns,
                           struct kern_ipc_perm *ipcp,
-                          struct ipc_ops *ops,
+                          const struct ipc_ops *ops,
                           struct ipc_params *params)
 {
        int err;
@@ -375,7 +375,7 @@ static int ipc_check_perms(struct ipc_namespace *ns,
  * On success, the ipc id is returned.
  */
 static int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
-               struct ipc_ops *ops, struct ipc_params *params)
+               const struct ipc_ops *ops, struct ipc_params *params)
 {
        struct kern_ipc_perm *ipcp;
        int flg = params->flg;
@@ -678,7 +678,7 @@ out:
  * Common routine called by sys_msgget(), sys_semget() and sys_shmget().
  */
 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
-                       struct ipc_ops *ops, struct ipc_params *params)
+                       const struct ipc_ops *ops, struct ipc_params *params)
 {
        if (params->key == IPC_PRIVATE)
                return ipcget_new(ns, ids, ops, params);
index 9c47d6f6c7b4b6c63b05b8a7c246ea3efcdeb0dc..e1153ad574b7adf0e463a2b0690793b69a4c47da 100644 (file)
@@ -201,7 +201,7 @@ static inline bool ipc_valid_object(struct kern_ipc_perm *perm)
 
 struct kern_ipc_perm *ipc_obtain_object_check(struct ipc_ids *ids, int id);
 int ipcget(struct ipc_namespace *ns, struct ipc_ids *ids,
-                       struct ipc_ops *ops, struct ipc_params *params);
+                       const struct ipc_ops *ops, struct ipc_params *params);
 void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
                void (*free)(struct ipc_namespace *, struct kern_ipc_perm *));
 #endif