diff options
Diffstat (limited to 'ipc/msg.c')
| -rw-r--r-- | ipc/msg.c | 19 |
1 files changed, 14 insertions, 5 deletions
| @@ -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); | ||
| 556 | out_unlock: | 565 | out_unlock: |
| 557 | rcu_read_unlock(); | 566 | rcu_read_unlock(); |
| 558 | return err; | 567 | return err; |
