X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ipc%2Fsem.c;h=1a68338a9e84a71dff3f121503478a30479f2510;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=71f652c30a7f16f0589e0c51995169184163ff7a;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/ipc/sem.c b/ipc/sem.c index 71f652c30..1a68338a9 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -61,9 +61,6 @@ * (c) 2001 Red Hat Inc * Lockless wakeup * (c) 2003 Manfred Spraul - * - * support for audit of ipc object properties and permission changes - * Dustin Kirkland */ #include @@ -78,9 +75,6 @@ #include #include #include -#include -#include - #include #include "util.h" @@ -145,7 +139,7 @@ void __init sem_init (void) * * if it's IN_WAKEUP, then it must wait until the value changes * * if it's not -EINTR, then the operation was completed by * update_queue. semtimedop can return queue.status without - * performing any operation on the sem array. + * performing any operation on the semaphore array. * * otherwise it must acquire the spinlock and check what's up. * * The two-stage algorithm is necessary to protect against the following @@ -221,7 +215,7 @@ asmlinkage long sys_semget (key_t key, int nsems, int semflg) if (nsems < 0 || nsems > sc_semmsl) return -EINVAL; - mutex_lock(&sem_ids.mutex); + down(&sem_ids.sem); if (key == IPC_PRIVATE) { err = newary(key, nsems, semflg); @@ -234,7 +228,8 @@ asmlinkage long sys_semget (key_t key, int nsems, int semflg) err = -EEXIST; } else { sma = sem_lock(id); - BUG_ON(sma==NULL); + if(sma==NULL) + BUG(); if (nsems > sma->sem_nsems) err = -EINVAL; else if (ipcperms(&sma->sem_perm, semflg)) @@ -248,7 +243,7 @@ asmlinkage long sys_semget (key_t key, int nsems, int semflg) sem_unlock(sma); } - mutex_unlock(&sem_ids.mutex); + up(&sem_ids.sem); return err; } @@ -443,8 +438,8 @@ static int count_semzcnt (struct sem_array * sma, ushort semnum) return semzcnt; } -/* Free a semaphore set. freeary() is called with sem_ids.mutex locked and - * the spinlock for this semaphore set hold. sem_ids.mutex remains locked +/* Free a semaphore set. freeary() is called with sem_ids.sem down and + * the spinlock for this semaphore set hold. sem_ids.sem remains locked * on exit. */ static void freeary (struct sem_array *sma, int id) @@ -531,7 +526,7 @@ static int semctl_nolock(int semid, int semnum, int cmd, int version, union semu seminfo.semmnu = SEMMNU; seminfo.semmap = SEMMAP; seminfo.semume = SEMUME; - mutex_lock(&sem_ids.mutex); + down(&sem_ids.sem); if (cmd == SEM_INFO) { seminfo.semusz = sem_ids.in_use; seminfo.semaem = used_sems; @@ -540,7 +535,7 @@ static int semctl_nolock(int semid, int semnum, int cmd, int version, union semu seminfo.semaem = SEMAEM; } max_id = sem_ids.max_id; - mutex_unlock(&sem_ids.mutex); + up(&sem_ids.sem); if (copy_to_user (arg.__buf, &seminfo, sizeof(struct seminfo))) return -EFAULT; return (max_id < 0) ? 0: max_id; @@ -815,6 +810,8 @@ static int semctl_down(int semid, int semnum, int cmd, int version, union semun if(cmd == IPC_SET) { if(copy_semid_from_user (&setbuf, arg.buf, version)) return -EFAULT; + if ((err = audit_ipc_perms(0, setbuf.uid, setbuf.gid, setbuf.mode))) + return err; } sma = sem_lock(semid); if(sma==NULL) @@ -825,11 +822,7 @@ static int semctl_down(int semid, int semnum, int cmd, int version, union semun goto out_unlock; } ipcp = &sma->sem_perm; - - err = audit_ipc_obj(ipcp); - if (err) - goto out_unlock; - + if (current->euid != ipcp->cuid && current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN)) { err=-EPERM; @@ -846,9 +839,6 @@ static int semctl_down(int semid, int semnum, int cmd, int version, union semun err = 0; break; case IPC_SET: - err = audit_ipc_set_perm(0, setbuf.uid, setbuf.gid, setbuf.mode, ipcp); - if (err) - goto out_unlock; ipcp->uid = setbuf.uid; ipcp->gid = setbuf.gid; ipcp->mode = (ipcp->mode & ~S_IRWXUGO) @@ -897,9 +887,9 @@ asmlinkage long sys_semctl (int semid, int semnum, int cmd, union semun arg) return err; case IPC_RMID: case IPC_SET: - mutex_lock(&sem_ids.mutex); + down(&sem_ids.sem); err = semctl_down(semid,semnum,cmd,version,arg); - mutex_unlock(&sem_ids.mutex); + up(&sem_ids.sem); return err; default: return -EINVAL; @@ -1193,7 +1183,8 @@ retry_undos: sma = sem_lock(semid); if(sma==NULL) { - BUG_ON(queue.prev != NULL); + if(queue.prev != NULL) + BUG(); error = -EIDRM; goto out_free; } @@ -1310,9 +1301,9 @@ found: /* perform adjustments registered in u */ nsems = sma->sem_nsems; for (i = 0; i < nsems; i++) { - struct sem * semaphore = &sma->sem_base[i]; + struct sem * sem = &sma->sem_base[i]; if (u->semadj[i]) { - semaphore->semval += u->semadj[i]; + sem->semval += u->semadj[i]; /* * Range checks of the new semaphore value, * not defined by sus: @@ -1326,11 +1317,11 @@ found: * * Manfred */ - if (semaphore->semval < 0) - semaphore->semval = 0; - if (semaphore->semval > SEMVMX) - semaphore->semval = SEMVMX; - semaphore->sempid = current->tgid; + if (sem->semval < 0) + sem->semval = 0; + if (sem->semval > SEMVMX) + sem->semval = SEMVMX; + sem->sempid = current->tgid; } } sma->sem_otime = get_seconds();