diff options
Diffstat (limited to 'net/ipv4/netfilter/nf_socket_ipv4.c')
-rw-r--r-- | net/ipv4/netfilter/nf_socket_ipv4.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/ipv4/netfilter/nf_socket_ipv4.c b/net/ipv4/netfilter/nf_socket_ipv4.c index 4824b1e183a1..0f4ed1bf9d77 100644 --- a/net/ipv4/netfilter/nf_socket_ipv4.c +++ b/net/ipv4/netfilter/nf_socket_ipv4.c @@ -100,6 +100,7 @@ struct sock *nf_sk_lookup_slow_v4(struct net *net, const struct sk_buff *skb, __be16 uninitialized_var(dport), uninitialized_var(sport); const struct iphdr *iph = ip_hdr(skb); struct sk_buff *data_skb = NULL; + struct sock *sk = skb->sk; u8 uninitialized_var(protocol); #if IS_ENABLED(CONFIG_NF_CONNTRACK) enum ip_conntrack_info ctinfo; @@ -155,8 +156,14 @@ struct sock *nf_sk_lookup_slow_v4(struct net *net, const struct sk_buff *skb, } #endif - return nf_socket_get_sock_v4(net, data_skb, doff, protocol, saddr, - daddr, sport, dport, indev); + if (sk) + refcount_inc(&sk->sk_refcnt); + else + sk = nf_socket_get_sock_v4(dev_net(skb->dev), data_skb, doff, + protocol, saddr, daddr, sport, + dport, indev); + + return sk; } EXPORT_SYMBOL_GPL(nf_sk_lookup_slow_v4); |