tipc: fix bug in socket reception function
authorJon Paul Maloy <jon.maloy@ericsson.com>
Sun, 8 Feb 2015 16:10:50 +0000 (11:10 -0500)
committerDavid S. Miller <davem@davemloft.net>
Sun, 8 Feb 2015 21:09:25 +0000 (13:09 -0800)
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 <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/tipc/socket.c

index 6666680..4a98d15 100644 (file)
@@ -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))