diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/pppoe.c | 22 |
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 | ||
962 | do_skb_free: | 958 | kfree_skb(skb); |
963 | if (skb) | ||
964 | kfree_skb(skb); | ||
965 | end: | 959 | end: |
966 | return error; | 960 | return error; |
967 | } | 961 | } |