diff options
author | David S. Miller | 2017-08-22 02:06:42 +0200 |
---|---|---|
committer | David S. Miller | 2017-08-22 02:06:42 +0200 |
commit | e2a7c34fb2856fd5306e307e170e3dde358d0dce (patch) | |
tree | afeb300b04186b1a1f649b2cd8a401a75878297c /net/core/datagram.c | |
parent | net: sched: Add the invalid handle check in qdisc_class_find (diff) | |
parent | Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc (diff) | |
download | kernel-qcow2-linux-e2a7c34fb2856fd5306e307e170e3dde358d0dce.tar.gz kernel-qcow2-linux-e2a7c34fb2856fd5306e307e170e3dde358d0dce.tar.xz kernel-qcow2-linux-e2a7c34fb2856fd5306e307e170e3dde358d0dce.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/core/datagram.c')
-rw-r--r-- | net/core/datagram.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/core/datagram.c b/net/core/datagram.c index 2f3277945d35..a4d5f10d83a1 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -169,14 +169,20 @@ struct sk_buff *__skb_try_recv_from_queue(struct sock *sk, int *peeked, int *off, int *err, struct sk_buff **last) { + bool peek_at_off = false; struct sk_buff *skb; - int _off = *off; + int _off = 0; + + if (unlikely(flags & MSG_PEEK && *off >= 0)) { + peek_at_off = true; + _off = *off; + } *last = queue->prev; skb_queue_walk(queue, skb) { if (flags & MSG_PEEK) { - if (_off >= skb->len && (skb->len || _off || - skb->peeked)) { + if (peek_at_off && _off >= skb->len && + (_off || skb->peeked)) { _off -= skb->len; continue; } |