|
@@ -839,7 +839,7 @@ static inline void free_copy(struct msg_msg *copy)
|
|
|
|
|
|
static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
|
|
|
{
|
|
|
- struct msg_msg *msg;
|
|
|
+ struct msg_msg *msg, *found = NULL;
|
|
|
long count = 0;
|
|
|
|
|
|
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)
|
|
|
*msgtyp, mode)) {
|
|
|
if (mode == SEARCH_LESSEQUAL && msg->m_type != 1) {
|
|
|
*msgtyp = msg->m_type - 1;
|
|
|
+ found = msg;
|
|
|
} else if (mode == SEARCH_NUMBER) {
|
|
|
if (*msgtyp == count)
|
|
|
return msg;
|
|
@@ -857,7 +858,7 @@ static struct msg_msg *find_msg(struct msg_queue *msq, long *msgtyp, int mode)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return ERR_PTR(-EAGAIN);
|
|
|
+ return found ?: ERR_PTR(-EAGAIN);
|
|
|
}
|
|
|
|
|
|
long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,
|