aboutsummaryrefslogtreecommitdiffstats
path: root/ipc/sem.c
diff options
context:
space:
mode:
authorPierre Peiffer <pierre.peiffer@bull.net>2008-04-29 04:00:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-29 11:06:14 -0400
commita5f75e7f256f75759ec3d6dbef0ba932f1b397d2 (patch)
tree89b2ed22547a9fca11f87eb6cba68bb84fcf1b8a /ipc/sem.c
parent8f4a3809c18ff3107bdbb1fabe3f4e5d2a928321 (diff)
IPC: consolidate all xxxctl_down() functions
semctl_down(), msgctl_down() and shmctl_down() are used to handle the same set of commands for each kind of IPC. They all start to do the same job (they retrieve the ipc and do some permission checks) before handling the commands on their own. This patch proposes to consolidate this by moving these same pieces of code into one common function called ipcctl_pre_down(). It simplifies a little these xxxctl_down() functions and increases a little the maintainability. Signed-off-by: Pierre Peiffer <pierre.peiffer@bull.net> Acked-by: Serge Hallyn <serue@us.ibm.com> Cc: Nadia Derbey <Nadia.Derbey@bull.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc/sem.c')
-rw-r--r--ipc/sem.c42
1 files changed, 4 insertions, 38 deletions
diff --git a/ipc/sem.c b/ipc/sem.c
index e803abec2b08..d56d3ab6bb8a 100644
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -141,21 +141,6 @@ void __init sem_init (void)
141} 141}
142 142
143/* 143/*
144 * This routine is called in the paths where the rw_mutex is held to protect
145 * access to the idr tree.
146 */
147static inline struct sem_array *sem_lock_check_down(struct ipc_namespace *ns,
148 int id)
149{
150 struct kern_ipc_perm *ipcp = ipc_lock_check_down(&sem_ids(ns), id);
151
152 if (IS_ERR(ipcp))
153 return (struct sem_array *)ipcp;
154
155 return container_of(ipcp, struct sem_array, sem_perm);
156}
157
158/*
159 * sem_lock_(check_) routines are called in the paths where the rw_mutex 144 * sem_lock_(check_) routines are called in the paths where the rw_mutex
160 * is not held. 145 * is not held.
161 */ 146 */
@@ -878,31 +863,12 @@ static int semctl_down(struct ipc_namespace *ns, int semid,
878 if (copy_semid_from_user(&semid64, arg.buf, version)) 863 if (copy_semid_from_user(&semid64, arg.buf, version))
879 return -EFAULT; 864 return -EFAULT;
880 } 865 }
881 down_write(&sem_ids(ns).rw_mutex);
882 sma = sem_lock_check_down(ns, semid);
883 if (IS_ERR(sma)) {
884 err = PTR_ERR(sma);
885 goto out_up;
886 }
887
888 ipcp = &sma->sem_perm;
889 866
890 err = audit_ipc_obj(ipcp); 867 ipcp = ipcctl_pre_down(&sem_ids(ns), semid, cmd, &semid64.sem_perm, 0);
891 if (err) 868 if (IS_ERR(ipcp))
892 goto out_unlock; 869 return PTR_ERR(ipcp);
893 870
894 if (cmd == IPC_SET) { 871 sma = container_of(ipcp, struct sem_array, sem_perm);
895 err = audit_ipc_set_perm(0, semid64.sem_perm.uid,
896 semid64.sem_perm.gid,
897 semid64.sem_perm.mode);
898 if (err)
899 goto out_unlock;
900 }
901 if (current->euid != ipcp->cuid &&
902 current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) {
903 err=-EPERM;
904 goto out_unlock;
905 }
906 872
907 err = security_sem_semctl(sma, cmd); 873 err = security_sem_semctl(sma, cmd);
908 if (err) 874 if (err)