ppp_generic: handle non-linear skbs when passing them to pppd
authorSimon Arlott <simon@fire.lp0.eu>
Mon, 3 May 2010 10:20:27 +0000 (10:20 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 May 2010 20:27:00 +0000 (13:27 -0700)
Frequently when using PPPoE with an interface MTU greater than 1500,
the skb is likely to be non-linear. If the skb needs to be passed to
pppd then the skb data must be read correctly.

The previous commit fixes an issue with accidentally sending skbs
to pppd based on an invalid read of the protocol type. When that
error occurred pppd was reading invalid skb data too.

Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ppp_generic.c

index 75e8903c37540d89ae8036a47de8de185297a023..8518a2e58e5362254221ba11a0ba34146d84f47b 100644 (file)
@@ -405,6 +405,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
        DECLARE_WAITQUEUE(wait, current);
        ssize_t ret;
        struct sk_buff *skb = NULL;
+       struct iovec iov;
 
        ret = count;
 
@@ -448,7 +449,9 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
        if (skb->len > count)
                goto outf;
        ret = -EFAULT;
-       if (copy_to_user(buf, skb->data, skb->len))
+       iov.iov_base = buf;
+       iov.iov_len = count;
+       if (skb_copy_datagram_iovec(skb, 0, &iov, skb->len))
                goto outf;
        ret = skb->len;