Skip to content

Commit 368ae53

Browse files
Svenning Sørensentorvalds
Svenning Sørensen
authored andcommitted
IPC: bugfix for msgrcv with msgtyp < 0
According to 'man msgrcv': "If msgtyp is less than 0, the first message of the lowest type that is less than or equal to the absolute value of msgtyp shall be received." Bug: The kernel only returns a message if its type is 1; other messages with type < abs(msgtype) will never get returned. Fix: After having traversed the list to find the first message with the lowest type, we need to actually return that message. This regression was introduced by commit daaf74c ("ipc: refactor msg list search into separate function") Signed-off-by: Svenning Soerensen <[email protected]> Reviewed-by: Peter Hurley <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent aaaafb7 commit 368ae53

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

ipc/msg.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,7 @@ static inline void free_copy(struct msg_msg *copy)
839839

840840
static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
841841
{
842-
struct msg_msg *msg;
842+
struct msg_msg *msg, *found = NULL;
843843
long count = 0;
844844

845845
list_for_each_entry(msg, &msq->q_messages, m_list) {
@@ -848,6 +848,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
848848
*msgtyp, mode)) {
849849
if (mode == SEARCH_LESSEQUAL && msg->m_type != 1) {
850850
*msgtyp = msg->m_type - 1;
851+
found = msg;
851852
} else if (mode == SEARCH_NUMBER) {
852853
if (*msgtyp == count)
853854
return msg;
@@ -857,7 +858,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
857858
}
858859
}
859860

860-
return ERR_PTR(-EAGAIN);
861+
return found ?: ERR_PTR(-EAGAIN);
861862
}
862863

863864
long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,

0 commit comments

Comments
 (0)