]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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 d0c9e6da90f778a491a38cccea19fa82658aaa58..d9c4a603c25eb9aee6828ddfbf355f0f4840d72a 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,
-                                                       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,
index 6616bfb33fa4a95a01945db795ae1734cbe74a07..a4963138bf43487b8531e2570df6b93d0186d137 100644 (file)
@@ -709,7 +709,6 @@ EXPORT_SYMBOL(__skb_checksum_complete);
  *     @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.
  *
@@ -719,14 +718,11 @@ EXPORT_SYMBOL(__skb_checksum_complete);
  *                        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;
 
-       if (chunk > len)
-               chunk = len;
-
        if (!chunk)
                return 0;
 
index 3877e16782479fedb3a3985e419e54d5c9b49d04..039e40f33860793dcc510e3e6a5010b28c92c356 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,
-                                                      tp->ucopy.iov, chunk);
+                                                      tp->ucopy.iov);
 
        if (!err) {
                tp->ucopy.len -= chunk;
index b1112217c76a6ca3c3d95cf432620456e682730f..5e920439a89ae64d23faf36823a929ad045176ef 100644 (file)
@@ -1207,7 +1207,7 @@ try_again:
        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;
index d1e528c1c37c3a797a2ed8f82fc13c920ddc6b06..bebc821086947e8738f9b161385e4911f88ddfba 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 {
-               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;
        }
index 330880323e1c9258fb4fbe013cfb454d095b545e..15f75e4967e55d33efb0d1fca9c45ae7a4a05a19 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_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;
        }
index c67f5d3f6e619f3ab49bdc25723869b3612056c0..5cc2da5d295d727e6346c51eceae8e0211b7ceb9 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);
+                                                              msg->msg_iov);
                        if (ret == -EINVAL)
                                goto csum_copy_error;
                }