diff options
author | Jiri Kosina <jkosina@suse.cz> | 2008-06-04 04:26:59 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2008-06-04 04:26:59 -0400 |
commit | f38bb7de289f5c15e287386d35e9c325f1062c49 (patch) | |
tree | 38e69a9ecea18243e3f66bcf51bc89cd7b8f0c94 /drivers/net/pppol2tp.c | |
parent | 2d4b3f37ded8998a362c8d0b4be02f583dd9a002 (diff) | |
parent | c3b25b32e8bef526cca748e1ba023c6bdd705a99 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/net/pppol2tp.c')
-rw-r--r-- | drivers/net/pppol2tp.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 79359919335b..8db342f2fdc9 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
@@ -980,6 +980,8 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
980 | __wsum csum = 0; | 980 | __wsum csum = 0; |
981 | struct udphdr *uh; | 981 | struct udphdr *uh; |
982 | unsigned int len; | 982 | unsigned int len; |
983 | int old_headroom; | ||
984 | int new_headroom; | ||
983 | 985 | ||
984 | if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) | 986 | if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) |
985 | goto abort; | 987 | goto abort; |
@@ -1001,16 +1003,18 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
1001 | 1003 | ||
1002 | /* Check that there's enough headroom in the skb to insert IP, | 1004 | /* Check that there's enough headroom in the skb to insert IP, |
1003 | * UDP and L2TP and PPP headers. If not enough, expand it to | 1005 | * UDP and L2TP and PPP headers. If not enough, expand it to |
1004 | * make room. Note that a new skb (or a clone) is | 1006 | * make room. Adjust truesize. |
1005 | * allocated. If we return an error from this point on, make | ||
1006 | * sure we free the new skb but do not free the original skb | ||
1007 | * since that is done by the caller for the error case. | ||
1008 | */ | 1007 | */ |
1009 | headroom = NET_SKB_PAD + sizeof(struct iphdr) + | 1008 | headroom = NET_SKB_PAD + sizeof(struct iphdr) + |
1010 | sizeof(struct udphdr) + hdr_len + sizeof(ppph); | 1009 | sizeof(struct udphdr) + hdr_len + sizeof(ppph); |
1010 | old_headroom = skb_headroom(skb); | ||
1011 | if (skb_cow_head(skb, headroom)) | 1011 | if (skb_cow_head(skb, headroom)) |
1012 | goto abort; | 1012 | goto abort; |
1013 | 1013 | ||
1014 | new_headroom = skb_headroom(skb); | ||
1015 | skb_orphan(skb); | ||
1016 | skb->truesize += new_headroom - old_headroom; | ||
1017 | |||
1014 | /* Setup PPP header */ | 1018 | /* Setup PPP header */ |
1015 | __skb_push(skb, sizeof(ppph)); | 1019 | __skb_push(skb, sizeof(ppph)); |
1016 | skb->data[0] = ppph[0]; | 1020 | skb->data[0] = ppph[0]; |
@@ -1065,7 +1069,6 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
1065 | /* Get routing info from the tunnel socket */ | 1069 | /* Get routing info from the tunnel socket */ |
1066 | dst_release(skb->dst); | 1070 | dst_release(skb->dst); |
1067 | skb->dst = dst_clone(__sk_dst_get(sk_tun)); | 1071 | skb->dst = dst_clone(__sk_dst_get(sk_tun)); |
1068 | skb_orphan(skb); | ||
1069 | skb->sk = sk_tun; | 1072 | skb->sk = sk_tun; |
1070 | 1073 | ||
1071 | /* Queue the packet to IP for output */ | 1074 | /* Queue the packet to IP for output */ |