summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJamie Bainbridge <jbainbri@redhat.com>2017-04-26 02:43:27 +0200
committerDavid S. Miller <davem@davemloft.net>2017-04-26 20:59:35 +0200
commit105f5528b9bbaa08b526d3405a5bcd2ff0c953c8 (patch)
tree07bed60e50a2383e335983dc3f3c468d9ae8e1dd
parenttcp: memset ca_priv data to 0 properly (diff)
downloadlinux-105f5528b9bbaa08b526d3405a5bcd2ff0c953c8.tar.xz
linux-105f5528b9bbaa08b526d3405a5bcd2ff0c953c8.zip
ipv6: check raw payload size correctly in ioctl
In situations where an skb is paged, the transport header pointer and tail pointer can be the same because the skb contents are in frags. This results in ioctl(SIOCINQ/FIONREAD) incorrectly returning a length of 0 when the length to receive is actually greater than zero. skb->len is already correctly set in ip6_input_finish() with pskb_pull(), so use skb->len as it always returns the correct result for both linear and paged data. Signed-off-by: Jamie Bainbridge <jbainbri@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv6/raw.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index f174e76e6505..0da6a12b5472 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -1178,8 +1178,7 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
spin_lock_bh(&sk->sk_receive_queue.lock);
skb = skb_peek(&sk->sk_receive_queue);
if (skb)
- amount = skb_tail_pointer(skb) -
- skb_transport_header(skb);
+ amount = skb->len;
spin_unlock_bh(&sk->sk_receive_queue.lock);
return put_user(amount, (int __user *)arg);
}