diff options
Diffstat (limited to 'ipc/msg.c')
-rw-r--r-- | ipc/msg.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -839,7 +839,7 @@ static inline void free_copy(struct msg_msg *copy) | |||
839 | 839 | ||
840 | static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode) | 840 | static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode) |
841 | { | 841 | { |
842 | struct msg_msg *msg; | 842 | struct msg_msg *msg, *found = NULL; |
843 | long count = 0; | 843 | long count = 0; |
844 | 844 | ||
845 | list_for_each_entry(msg, &msq->q_messages, m_list) { | 845 | 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) | |||
848 | *msgtyp, mode)) { | 848 | *msgtyp, mode)) { |
849 | if (mode == SEARCH_LESSEQUAL && msg->m_type != 1) { | 849 | if (mode == SEARCH_LESSEQUAL && msg->m_type != 1) { |
850 | *msgtyp = msg->m_type - 1; | 850 | *msgtyp = msg->m_type - 1; |
851 | found = msg; | ||
851 | } else if (mode == SEARCH_NUMBER) { | 852 | } else if (mode == SEARCH_NUMBER) { |
852 | if (*msgtyp == count) | 853 | if (*msgtyp == count) |
853 | return msg; | 854 | return msg; |
@@ -857,7 +858,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode) | |||
857 | } | 858 | } |
858 | } | 859 | } |
859 | 860 | ||
860 | return ERR_PTR(-EAGAIN); | 861 | return found ?: ERR_PTR(-EAGAIN); |
861 | } | 862 | } |
862 | 863 | ||
863 | long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg, | 864 | long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg, |