diff options
| author | David S. Miller <davem@davemloft.net> | 2005-05-19 15:36:33 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2005-05-19 15:36:33 -0400 |
| commit | 8be58932ca596972e4953ae980d8bc286857cae8 (patch) | |
| tree | 44ee4e92a652bdbc3f3f368bc8f253ce9539a13a | |
| parent | d9fa0f392b20b2b8e3df379c44194492a2446c6e (diff) | |
[NETFILTER]: Do not be clever about SKB ownership in ip_ct_gather_frags().
Just do an skb_orphan() and be done with it.
Based upon discussions with Herbert Xu on netdev.
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/ipv4/netfilter/ip_conntrack_core.c | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c index 28d9425d5c39..09e824622977 100644 --- a/net/ipv4/netfilter/ip_conntrack_core.c +++ b/net/ipv4/netfilter/ip_conntrack_core.c | |||
| @@ -940,37 +940,25 @@ void ip_ct_refresh_acct(struct ip_conntrack *ct, | |||
| 940 | struct sk_buff * | 940 | struct sk_buff * |
| 941 | ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user) | 941 | ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user) |
| 942 | { | 942 | { |
| 943 | struct sock *sk = skb->sk; | ||
| 944 | #ifdef CONFIG_NETFILTER_DEBUG | 943 | #ifdef CONFIG_NETFILTER_DEBUG |
| 945 | unsigned int olddebug = skb->nf_debug; | 944 | unsigned int olddebug = skb->nf_debug; |
| 946 | #endif | 945 | #endif |
| 947 | 946 | ||
| 948 | if (sk) { | 947 | skb_orphan(skb); |
| 949 | sock_hold(sk); | ||
| 950 | skb_orphan(skb); | ||
| 951 | } | ||
| 952 | 948 | ||
| 953 | local_bh_disable(); | 949 | local_bh_disable(); |
| 954 | skb = ip_defrag(skb, user); | 950 | skb = ip_defrag(skb, user); |
| 955 | local_bh_enable(); | 951 | local_bh_enable(); |
| 956 | 952 | ||
| 957 | if (!skb) { | 953 | if (skb) { |
| 958 | if (sk) | 954 | ip_send_check(skb->nh.iph); |
| 959 | sock_put(sk); | 955 | skb->nfcache |= NFC_ALTERED; |
| 960 | return skb; | ||
| 961 | } | ||
| 962 | |||
| 963 | if (sk) { | ||
| 964 | skb_set_owner_w(skb, sk); | ||
| 965 | sock_put(sk); | ||
| 966 | } | ||
| 967 | |||
| 968 | ip_send_check(skb->nh.iph); | ||
| 969 | skb->nfcache |= NFC_ALTERED; | ||
| 970 | #ifdef CONFIG_NETFILTER_DEBUG | 956 | #ifdef CONFIG_NETFILTER_DEBUG |
| 971 | /* Packet path as if nothing had happened. */ | 957 | /* Packet path as if nothing had happened. */ |
| 972 | skb->nf_debug = olddebug; | 958 | skb->nf_debug = olddebug; |
| 973 | #endif | 959 | #endif |
| 960 | } | ||
| 961 | |||
| 974 | return skb; | 962 | return skb; |
| 975 | } | 963 | } |
| 976 | 964 | ||
