|
@@ -1077,17 +1077,12 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
|
|
|
nsems = sma->sem_nsems;
|
|
|
|
|
|
err = -EACCES;
|
|
|
- if (ipcperms(ns, &sma->sem_perm,
|
|
|
- cmd == SETALL ? S_IWUGO : S_IRUGO)) {
|
|
|
- rcu_read_unlock();
|
|
|
- goto out_wakeup;
|
|
|
- }
|
|
|
+ if (ipcperms(ns, &sma->sem_perm, cmd == SETALL ? S_IWUGO : S_IRUGO))
|
|
|
+ goto out_rcu_wakeup;
|
|
|
|
|
|
err = security_sem_semctl(sma, cmd);
|
|
|
- if (err) {
|
|
|
- rcu_read_unlock();
|
|
|
- goto out_wakeup;
|
|
|
- }
|
|
|
+ if (err)
|
|
|
+ goto out_rcu_wakeup;
|
|
|
|
|
|
err = -EACCES;
|
|
|
switch (cmd) {
|
|
@@ -1188,10 +1183,8 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
|
|
|
/* GETVAL, GETPID, GETNCTN, GETZCNT: fall-through */
|
|
|
}
|
|
|
err = -EINVAL;
|
|
|
- if (semnum < 0 || semnum >= nsems) {
|
|
|
- rcu_read_unlock();
|
|
|
- goto out_wakeup;
|
|
|
- }
|
|
|
+ if (semnum < 0 || semnum >= nsems)
|
|
|
+ goto out_rcu_wakeup;
|
|
|
|
|
|
sem_lock(sma, NULL, -1);
|
|
|
curr = &sma->sem_base[semnum];
|
|
@@ -1213,8 +1206,8 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
|
|
|
|
|
|
out_unlock:
|
|
|
sem_unlock(sma, -1);
|
|
|
+out_rcu_wakeup:
|
|
|
rcu_read_unlock();
|
|
|
-out_wakeup:
|
|
|
wake_up_sem_queue_do(&tasks);
|
|
|
out_free:
|
|
|
if(sem_io != fast_sem_io)
|
|
@@ -1585,22 +1578,16 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
|
|
|
}
|
|
|
|
|
|
error = -EFBIG;
|
|
|
- if (max >= sma->sem_nsems) {
|
|
|
- rcu_read_unlock();
|
|
|
- goto out_wakeup;
|
|
|
- }
|
|
|
+ if (max >= sma->sem_nsems)
|
|
|
+ goto out_rcu_wakeup;
|
|
|
|
|
|
error = -EACCES;
|
|
|
- if (ipcperms(ns, &sma->sem_perm, alter ? S_IWUGO : S_IRUGO)) {
|
|
|
- rcu_read_unlock();
|
|
|
- goto out_wakeup;
|
|
|
- }
|
|
|
+ if (ipcperms(ns, &sma->sem_perm, alter ? S_IWUGO : S_IRUGO))
|
|
|
+ goto out_rcu_wakeup;
|
|
|
|
|
|
error = security_sem_semop(sma, sops, nsops, alter);
|
|
|
- if (error) {
|
|
|
- rcu_read_unlock();
|
|
|
- goto out_wakeup;
|
|
|
- }
|
|
|
+ if (error)
|
|
|
+ goto out_rcu_wakeup;
|
|
|
|
|
|
/*
|
|
|
* semid identifiers are not unique - find_alloc_undo may have
|
|
@@ -1718,8 +1705,8 @@ sleep_again:
|
|
|
|
|
|
out_unlock_free:
|
|
|
sem_unlock(sma, locknum);
|
|
|
+out_rcu_wakeup:
|
|
|
rcu_read_unlock();
|
|
|
-out_wakeup:
|
|
|
wake_up_sem_queue_do(&tasks);
|
|
|
out_free:
|
|
|
if(sops != fast_sops)
|