From 51a00daf7369b581e5241c5cae5924886deda261 Mon Sep 17 00:00:00 2001 From: Jon Paul Maloy Date: Sun, 8 Feb 2015 11:10:50 -0500 Subject: tipc: fix bug in socket reception function In commit c637c1035534867b85b78b453c38c495b58e2c5a ("tipc: resolve race problem at unicast message reception") we introduced a time limit for how long the function tipc_sk_eneque() would be allowed to execute its loop. Unfortunately, the test for when this limit is passed was put in the wrong place, resulting in a lost message when the test is true. We fix this by moving the test to before we dequeue the next buffer from the input queue. Signed-off-by: Jon Maloy Signed-off-by: David S. Miller --- net/tipc/socket.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'net') diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 6666680..4a98d15 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1802,12 +1802,11 @@ static int tipc_sk_enqueue(struct sk_buff_head *inputq, struct sock *sk, unsigned long time_limit = jiffies + 2; while (skb_queue_len(inputq)) { + if (unlikely(time_after_eq(jiffies, time_limit))) + return TIPC_OK; skb = tipc_skb_dequeue(inputq, dport); if (unlikely(!skb)) return TIPC_OK; - /* Return if softirq window exhausted */ - if (unlikely(time_after_eq(jiffies, time_limit))) - return TIPC_OK; if (!sock_owned_by_user(sk)) { err = filter_rcv(sk, &skb); if (likely(!skb)) -- cgit v1.1