aboutsummaryrefslogtreecommitdiffstats
path: root/ipc/msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/msg.c')
-rw-r--r--ipc/msg.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/ipc/msg.c b/ipc/msg.c
index 203281198079..7cb89a9b24e2 100644
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -492,7 +492,6 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
492 int cmd, struct msqid64_ds *p) 492 int cmd, struct msqid64_ds *p)
493{ 493{
494 struct msg_queue *msq; 494 struct msg_queue *msq;
495 int id = 0;
496 int err; 495 int err;
497 496
498 memset(p, 0, sizeof(*p)); 497 memset(p, 0, sizeof(*p));
@@ -504,7 +503,6 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
504 err = PTR_ERR(msq); 503 err = PTR_ERR(msq);
505 goto out_unlock; 504 goto out_unlock;
506 } 505 }
507 id = msq->q_perm.id;
508 } else { /* IPC_STAT */ 506 } else { /* IPC_STAT */
509 msq = msq_obtain_object_check(ns, msqid); 507 msq = msq_obtain_object_check(ns, msqid);
510 if (IS_ERR(msq)) { 508 if (IS_ERR(msq)) {
@@ -549,10 +547,21 @@ static int msgctl_stat(struct ipc_namespace *ns, int msqid,
549 p->msg_lspid = pid_vnr(msq->q_lspid); 547 p->msg_lspid = pid_vnr(msq->q_lspid);
550 p->msg_lrpid = pid_vnr(msq->q_lrpid); 548 p->msg_lrpid = pid_vnr(msq->q_lrpid);
551 549
552 ipc_unlock_object(&msq->q_perm); 550 if (cmd == IPC_STAT) {
553 rcu_read_unlock(); 551 /*
554 return id; 552 * As defined in SUS:
553 * Return 0 on success
554 */
555 err = 0;
556 } else {
557 /*
558 * MSG_STAT and MSG_STAT_ANY (both Linux specific)
559 * Return the full id, including the sequence number
560 */
561 err = msq->q_perm.id;
562 }
555 563
564 ipc_unlock_object(&msq->q_perm);
556out_unlock: 565out_unlock:
557 rcu_read_unlock(); 566 rcu_read_unlock();
558 return err; 567 return err;