|
@@ -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;
|