diff -pur a/net/tipc/tipc_socket.c b/net/tipc/tipc_socket.c --- a/net/tipc/tipc_socket.c 2007-05-08 21:50:57.000000000 +0200 +++ b/net/tipc/tipc_socket.c 2007-06-24 17:54:45.119333330 +0200 @@ -1112,7 +1112,8 @@ restart: /* Loop around if more data is required */ if ((sz_copied < buf_len) /* didn't get all requested data */ - && (flags & MSG_WAITALL) /* ... and need to wait for more */ + && (!skb_queue_empty(&sk->sk_receive_queue) /* ... and there is more data to read ... */ + || (flags & MSG_WAITALL)) /* ... or need to wait for more */ && (!(flags & MSG_PEEK)) /* ... and aren't just peeking at data */ && (!err) /* ... and haven't reached a FIN */ )