aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/pppoe.c22
1 files changed, 8 insertions, 14 deletions
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c
index ebfa2967cd68..3080a44b23ab 100644
--- a/drivers/net/pppoe.c
+++ b/drivers/net/pppoe.c
@@ -347,7 +347,7 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb)
347 struct pppox_sock *relay_po = NULL; 347 struct pppox_sock *relay_po = NULL;
348 348
349 if (sk->sk_state & PPPOX_BOUND) { 349 if (sk->sk_state & PPPOX_BOUND) {
350 struct pppoe_hdr *ph = (struct pppoe_hdr *) skb->nh.raw; 350 struct pppoe_hdr *ph = pppoe_hdr(skb);
351 int len = ntohs(ph->length); 351 int len = ntohs(ph->length);
352 skb_pull_rcsum(skb, sizeof(struct pppoe_hdr)); 352 skb_pull_rcsum(skb, sizeof(struct pppoe_hdr));
353 if (pskb_trim_rcsum(skb, len)) 353 if (pskb_trim_rcsum(skb, len))
@@ -401,7 +401,7 @@ static int pppoe_rcv(struct sk_buff *skb,
401 if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 401 if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
402 goto out; 402 goto out;
403 403
404 ph = (struct pppoe_hdr *) skb->nh.raw; 404 ph = pppoe_hdr(skb);
405 405
406 po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source, dev->ifindex); 406 po = get_item((unsigned long) ph->sid, eth_hdr(skb)->h_source, dev->ifindex);
407 if (po != NULL) 407 if (po != NULL)
@@ -433,7 +433,7 @@ static int pppoe_disc_rcv(struct sk_buff *skb,
433 if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 433 if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
434 goto out; 434 goto out;
435 435
436 ph = (struct pppoe_hdr *) skb->nh.raw; 436 ph = pppoe_hdr(skb);
437 if (ph->code != PADT_CODE) 437 if (ph->code != PADT_CODE)
438 goto abort; 438 goto abort;
439 439
@@ -931,8 +931,6 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock,
931 struct sock *sk = sock->sk; 931 struct sock *sk = sock->sk;
932 struct sk_buff *skb = NULL; 932 struct sk_buff *skb = NULL;
933 int error = 0; 933 int error = 0;
934 int len;
935 struct pppoe_hdr *ph = NULL;
936 934
937 if (sk->sk_state & PPPOX_BOUND) { 935 if (sk->sk_state & PPPOX_BOUND) {
938 error = -EIO; 936 error = -EIO;
@@ -949,19 +947,15 @@ static int pppoe_recvmsg(struct kiocb *iocb, struct socket *sock,
949 m->msg_namelen = 0; 947 m->msg_namelen = 0;
950 948
951 if (skb) { 949 if (skb) {
952 error = 0; 950 struct pppoe_hdr *ph = pppoe_hdr(skb);
953 ph = (struct pppoe_hdr *) skb->nh.raw; 951 const int len = ntohs(ph->length);
954 len = ntohs(ph->length);
955 952
956 error = memcpy_toiovec(m->msg_iov, (unsigned char *) &ph->tag[0], len); 953 error = memcpy_toiovec(m->msg_iov, (unsigned char *) &ph->tag[0], len);
957 if (error < 0) 954 if (error == 0)
958 goto do_skb_free; 955 error = len;
959 error = len;
960 } 956 }
961 957
962do_skb_free: 958 kfree_skb(skb);
963 if (skb)
964 kfree_skb(skb);
965end: 959end:
966 return error; 960 return error;
967} 961}