Commit 19937d04 authored by Simon Arlott's avatar Simon Arlott Committed by David S. Miller

ppp_generic: handle non-linear skbs when passing them to pppd

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: default avatarSimon Arlott <simon@fire.lp0.eu>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ea8420e9
...@@ -405,6 +405,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf, ...@@ -405,6 +405,7 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
ssize_t ret; ssize_t ret;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
struct iovec iov;
ret = count; ret = count;
...@@ -448,7 +449,9 @@ static ssize_t ppp_read(struct file *file, char __user *buf, ...@@ -448,7 +449,9 @@ static ssize_t ppp_read(struct file *file, char __user *buf,
if (skb->len > count) if (skb->len > count)
goto outf; goto outf;
ret = -EFAULT; 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; goto outf;
ret = skb->len; ret = skb->len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment