projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
IPC: bugfix for msgrcv with msgtyp < 0
[firefly-linux-kernel-4.4.55.git]
/
ipc
/
msg.c
diff --git
a/ipc/msg.c
b/ipc/msg.c
index bd60d7e159e8962e1f1927d7b19188696d543d5d..9f29d9e89bac578a33f1f5c97e41e10f0f1d6403 100644
(file)
--- a/
ipc/msg.c
+++ b/
ipc/msg.c
@@
-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)
{
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) {
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;
*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;
} 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,
}
long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg,