Revert "net: add length argument to skb_copy_and_csum_datagram_iovec"
authorBen Hutchings <ben@decadent.org.uk>
Sat, 2 Jan 2016 01:11:55 +0000 (01:11 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Fri, 22 Jan 2016 21:40:09 +0000 (21:40 +0000)
This reverts commit 127500d724f8c43f452610c9080444eedb5eaa6c.  That fixed
the problem of buffer over-reads introduced by backporting commit
89c22d8c3b27 ("net: Fix skb csum races when peeking"), but resulted in
incorrect checksumming for short reads.  It will be replaced with a
complete fix.

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
include/linux/skbuff.h
net/core/datagram.c
net/ipv4/tcp_input.c
net/ipv4/udp.c
net/ipv6/raw.c
net/ipv6/udp.c
net/rxrpc/ar-recvmsg.c

index d0c9e6d..d9c4a60 100644 (file)
@@ -2134,8 +2134,7 @@ extern int               skb_copy_datagram_iovec(const struct sk_buff *from,
                                               int size);
 extern int            skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
                                                        int hlen,
                                               int size);
 extern int            skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
                                                        int hlen,
-                                                       struct iovec *iov,
-                                                       int len);
+                                                       struct iovec *iov);
 extern int            skb_copy_datagram_from_iovec(struct sk_buff *skb,
                                                    int offset,
                                                    const struct iovec *from,
 extern int            skb_copy_datagram_from_iovec(struct sk_buff *skb,
                                                    int offset,
                                                    const struct iovec *from,
index 6616bfb..a496313 100644 (file)
@@ -709,7 +709,6 @@ EXPORT_SYMBOL(__skb_checksum_complete);
  *     @skb: skbuff
  *     @hlen: hardware length
  *     @iov: io vector
  *     @skb: skbuff
  *     @hlen: hardware length
  *     @iov: io vector
- *     @len: amount of data to copy from skb to iov
  *
  *     Caller _must_ check that skb will fit to this iovec.
  *
  *
  *     Caller _must_ check that skb will fit to this iovec.
  *
@@ -719,14 +718,11 @@ EXPORT_SYMBOL(__skb_checksum_complete);
  *                        can be modified!
  */
 int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
  *                        can be modified!
  */
 int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
-                                    int hlen, struct iovec *iov, int len)
+                                    int hlen, struct iovec *iov)
 {
        __wsum csum;
        int chunk = skb->len - hlen;
 
 {
        __wsum csum;
        int chunk = skb->len - hlen;
 
-       if (chunk > len)
-               chunk = len;
-
        if (!chunk)
                return 0;
 
        if (!chunk)
                return 0;
 
index 3877e16..039e40f 100644 (file)
@@ -5198,7 +5198,7 @@ static int tcp_copy_to_iovec(struct sock *sk, struct sk_buff *skb, int hlen)
                err = skb_copy_datagram_iovec(skb, hlen, tp->ucopy.iov, chunk);
        else
                err = skb_copy_and_csum_datagram_iovec(skb, hlen,
                err = skb_copy_datagram_iovec(skb, hlen, tp->ucopy.iov, chunk);
        else
                err = skb_copy_and_csum_datagram_iovec(skb, hlen,
-                                                      tp->ucopy.iov, chunk);
+                                                      tp->ucopy.iov);
 
        if (!err) {
                tp->ucopy.len -= chunk;
 
        if (!err) {
                tp->ucopy.len -= chunk;
index b111221..5e92043 100644 (file)
@@ -1207,7 +1207,7 @@ try_again:
        else {
                err = skb_copy_and_csum_datagram_iovec(skb,
                                                       sizeof(struct udphdr),
        else {
                err = skb_copy_and_csum_datagram_iovec(skb,
                                                       sizeof(struct udphdr),
-                                                      msg->msg_iov, copied);
+                                                      msg->msg_iov);
 
                if (err == -EINVAL)
                        goto csum_copy_err;
 
                if (err == -EINVAL)
                        goto csum_copy_err;
index d1e528c..bebc821 100644 (file)
@@ -479,7 +479,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
                        goto csum_copy_err;
                err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
        } else {
                        goto csum_copy_err;
                err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
        } else {
-               err = skb_copy_and_csum_datagram_iovec(skb, 0, msg->msg_iov, copied);
+               err = skb_copy_and_csum_datagram_iovec(skb, 0, msg->msg_iov);
                if (err == -EINVAL)
                        goto csum_copy_err;
        }
                if (err == -EINVAL)
                        goto csum_copy_err;
        }
index 3308803..15f75e4 100644 (file)
@@ -383,8 +383,7 @@ try_again:
                err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),
                                              msg->msg_iov, copied       );
        else {
                err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr),
                                              msg->msg_iov, copied       );
        else {
-               err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr),
-                                                      msg->msg_iov, copied);
+               err = skb_copy_and_csum_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov);
                if (err == -EINVAL)
                        goto csum_copy_err;
        }
                if (err == -EINVAL)
                        goto csum_copy_err;
        }
index c67f5d3..5cc2da5 100644 (file)
@@ -185,8 +185,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock,
                                                      msg->msg_iov, copy);
                } else {
                        ret = skb_copy_and_csum_datagram_iovec(skb, offset,
                                                      msg->msg_iov, copy);
                } else {
                        ret = skb_copy_and_csum_datagram_iovec(skb, offset,
-                                                              msg->msg_iov,
-                                                              copy);
+                                                              msg->msg_iov);
                        if (ret == -EINVAL)
                                goto csum_copy_error;
                }
                        if (ret == -EINVAL)
                                goto csum_copy_error;
                }