OSDN Git Service

lightnvm: pblk: rework write error recovery path
[tomoyo/tomoyo-test1.git] / ipc / msg.c
index 114a211..56fd1c7 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -497,14 +497,14 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
        memset(p, 0, sizeof(*p));
 
        rcu_read_lock();
-       if (cmd == MSG_STAT) {
+       if (cmd == MSG_STAT || cmd == MSG_STAT_ANY) {
                msq = msq_obtain_object(ns, msqid);
                if (IS_ERR(msq)) {
                        err = PTR_ERR(msq);
                        goto out_unlock;
                }
                id = msq->q_perm.id;
-       } else {
+       } else { /* IPC_STAT */
                msq = msq_obtain_object_check(ns, msqid);
                if (IS_ERR(msq)) {
                        err = PTR_ERR(msq);
@@ -512,9 +512,14 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
                }
        }
 
-       err = -EACCES;
-       if (ipcperms(ns, &msq->q_perm, S_IRUGO))
-               goto out_unlock;
+       /* see comment for SHM_STAT_ANY */
+       if (cmd == MSG_STAT_ANY)
+               audit_ipc_obj(&msq->q_perm);
+       else {
+               err = -EACCES;
+               if (ipcperms(ns, &msq->q_perm, S_IRUGO))
+                       goto out_unlock;
+       }
 
        err = security_msg_queue_msgctl(&msq->q_perm, cmd);
        if (err)
@@ -572,6 +577,7 @@ long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
                return err;
        }
        case MSG_STAT:  /* msqid is an index rather than a msg queue id */
+       case MSG_STAT_ANY:
        case IPC_STAT:
                err = msgctl_stat(ns, msqid, cmd, &msqid64);
                if (err < 0)
@@ -690,6 +696,7 @@ long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr)
        }
        case IPC_STAT:
        case MSG_STAT:
+       case MSG_STAT_ANY:
                err = msgctl_stat(ns, msqid, cmd, &msqid64);
                if (err < 0)
                        return err;