]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - ipc/sem.c
Merge remote-tracking branch 'drm/drm-next' into drm-misc-next
[linux.git] / ipc / sem.c
index 2994da8ccc7f6d77b72451e96d6c7f4dcc0764c0..06be75d9217ace222500b2ebfa276bdee524f6e3 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -1220,14 +1220,14 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
        memset(semid64, 0, sizeof(*semid64));
 
        rcu_read_lock();
-       if (cmd == SEM_STAT) {
+       if (cmd == SEM_STAT || cmd == SEM_STAT_ANY) {
                sma = sem_obtain_object(ns, semid);
                if (IS_ERR(sma)) {
                        err = PTR_ERR(sma);
                        goto out_unlock;
                }
                id = sma->sem_perm.id;
-       } else {
+       } else { /* IPC_STAT */
                sma = sem_obtain_object_check(ns, semid);
                if (IS_ERR(sma)) {
                        err = PTR_ERR(sma);
@@ -1235,9 +1235,14 @@ static int semctl_stat(struct ipc_namespace *ns, int semid,
                }
        }
 
-       err = -EACCES;
-       if (ipcperms(ns, &sma->sem_perm, S_IRUGO))
-               goto out_unlock;
+       /* see comment for SHM_STAT_ANY */
+       if (cmd == SEM_STAT_ANY)
+               audit_ipc_obj(&sma->sem_perm);
+       else {
+               err = -EACCES;
+               if (ipcperms(ns, &sma->sem_perm, S_IRUGO))
+                       goto out_unlock;
+       }
 
        err = security_sem_semctl(&sma->sem_perm, cmd);
        if (err)
@@ -1626,6 +1631,7 @@ long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
                return semctl_info(ns, semid, cmd, p);
        case IPC_STAT:
        case SEM_STAT:
+       case SEM_STAT_ANY:
                err = semctl_stat(ns, semid, cmd, &semid64);
                if (err < 0)
                        return err;
@@ -1732,6 +1738,7 @@ long compat_ksys_semctl(int semid, int semnum, int cmd, int arg)
                return semctl_info(ns, semid, cmd, p);
        case IPC_STAT:
        case SEM_STAT:
+       case SEM_STAT_ANY:
                err = semctl_stat(ns, semid, cmd, &semid64);
                if (err < 0)
                        return err;