diff options
| author | <jgarzik@pretzel.yyz.us> | 2005-05-27 22:07:40 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-05-27 22:07:40 -0400 |
| commit | ff0e0ea2f5d36fa90fc2c57fd019102b0a0cfabf (patch) | |
| tree | 963cdd52a4032cd4827896c4e813cfbf6dd7b3e6 /net/ipv6/ip6_output.c | |
| parent | 43f66a6ce8da299344cf1bc2ac2311889cc88555 (diff) | |
| parent | 1f15d694522af9cd7492695f11dd2dc77b6cf098 (diff) | |
Automatic merge of /spare/repo/netdev-2.6 branch we18
Diffstat (limited to 'net/ipv6/ip6_output.c')
| -rw-r--r-- | net/ipv6/ip6_output.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 0f0711417c9d..b78a53586804 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -552,13 +552,17 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
| 552 | skb_headroom(frag) < hlen) | 552 | skb_headroom(frag) < hlen) |
| 553 | goto slow_path; | 553 | goto slow_path; |
| 554 | 554 | ||
| 555 | /* Correct socket ownership. */ | ||
| 556 | if (frag->sk == NULL) | ||
| 557 | goto slow_path; | ||
| 558 | |||
| 559 | /* Partially cloned skb? */ | 555 | /* Partially cloned skb? */ |
| 560 | if (skb_shared(frag)) | 556 | if (skb_shared(frag)) |
| 561 | goto slow_path; | 557 | goto slow_path; |
| 558 | |||
| 559 | BUG_ON(frag->sk); | ||
| 560 | if (skb->sk) { | ||
| 561 | sock_hold(skb->sk); | ||
| 562 | frag->sk = skb->sk; | ||
| 563 | frag->destructor = sock_wfree; | ||
| 564 | skb->truesize -= frag->truesize; | ||
| 565 | } | ||
| 562 | } | 566 | } |
| 563 | 567 | ||
| 564 | err = 0; | 568 | err = 0; |
| @@ -1116,12 +1120,10 @@ int ip6_push_pending_frames(struct sock *sk) | |||
| 1116 | tail_skb = &(tmp_skb->next); | 1120 | tail_skb = &(tmp_skb->next); |
| 1117 | skb->len += tmp_skb->len; | 1121 | skb->len += tmp_skb->len; |
| 1118 | skb->data_len += tmp_skb->len; | 1122 | skb->data_len += tmp_skb->len; |
| 1119 | #if 0 /* Logically correct, but useless work, ip_fragment() will have to undo */ | ||
| 1120 | skb->truesize += tmp_skb->truesize; | 1123 | skb->truesize += tmp_skb->truesize; |
| 1121 | __sock_put(tmp_skb->sk); | 1124 | __sock_put(tmp_skb->sk); |
| 1122 | tmp_skb->destructor = NULL; | 1125 | tmp_skb->destructor = NULL; |
| 1123 | tmp_skb->sk = NULL; | 1126 | tmp_skb->sk = NULL; |
| 1124 | #endif | ||
| 1125 | } | 1127 | } |
| 1126 | 1128 | ||
| 1127 | ipv6_addr_copy(final_dst, &fl->fl6_dst); | 1129 | ipv6_addr_copy(final_dst, &fl->fl6_dst); |
