Skip to content

Commit 105f552

Browse files
jbainbridavem330
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c120144 commit 105f552

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

net/ipv6/raw.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,8 +1178,7 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg)
11781178
spin_lock_bh(&sk->sk_receive_queue.lock);
11791179
skb = skb_peek(&sk->sk_receive_queue);
11801180
if (skb)
1181-
amount = skb_tail_pointer(skb) -
1182-
skb_transport_header(skb);
1181+
amount = skb->len;
11831182
spin_unlock_bh(&sk->sk_receive_queue.lock);
11841183
return put_user(amount, (int __user *)arg);
11851184
}

0 commit comments

Comments
 (0)