Skip to content

Commit

Permalink
[NETFILTER]: Keep conntrack reference until IPsec policy checks are done
Browse files Browse the repository at this point in the history
Keep the conntrack reference until policy checks have been performed for
IPsec NAT support. The reference needs to be dropped before a packet is
queued to avoid having the conntrack module unloadable.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Patrick McHardy authored and David S. Miller committed Jan 7, 2006
1 parent 5c901da commit b59c270
Show file tree
Hide file tree
Showing 6 changed files with 12 additions and 9 deletions.
1 change: 1 addition & 0 deletions net/dccp/ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -1099,6 +1099,7 @@ int dccp_v4_destroy_sock(struct sock *sk)
kfree_skb(sk->sk_send_head);
sk->sk_send_head = NULL;
}
nf_reset(skb);

/* Clean up a referenced DCCP bind bucket. */
if (inet_csk(sk)->icsk_bind_hash != NULL)
Expand Down
15 changes: 6 additions & 9 deletions net/ipv4/ip_input.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ int ip_call_ra_chain(struct sk_buff *skb)
raw_rcv(last, skb2);
}
last = sk;
nf_reset(skb);
}
}

Expand All @@ -204,10 +203,6 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)

__skb_pull(skb, ihl);

/* Free reference early: we don't need it any more, and it may
hold ip_conntrack module loaded indefinitely. */
nf_reset(skb);

/* Point into the IP datagram, just past the header. */
skb->h.raw = skb->data;

Expand All @@ -232,10 +227,12 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
int ret;

if (!ipprot->no_policy &&
!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
kfree_skb(skb);
goto out;
if (!ipprot->no_policy) {
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
kfree_skb(skb);
goto out;
}
nf_reset(skb);
}
ret = ipprot->handler(skb);
if (ret < 0) {
Expand Down
1 change: 1 addition & 0 deletions net/ipv4/raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
kfree_skb(skb);
return NET_RX_DROP;
}
nf_reset(skb);

skb_push(skb, skb->data - skb->nh.raw);

Expand Down
1 change: 1 addition & 0 deletions net/ipv4/tcp_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -1080,6 +1080,7 @@ int tcp_v4_rcv(struct sk_buff *skb)

if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
goto discard_and_relse;
nf_reset(skb);

if (sk_filter(sk, skb, 0))
goto discard_and_relse;
Expand Down
2 changes: 2 additions & 0 deletions net/ipv4/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -989,6 +989,7 @@ static int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
kfree_skb(skb);
return -1;
}
nf_reset(skb);

if (up->encap_type) {
/*
Expand Down Expand Up @@ -1149,6 +1150,7 @@ int udp_rcv(struct sk_buff *skb)

if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
goto drop;
nf_reset(skb);

/* No socket. Drop packet silently, if checksum is wrong */
if (udp_checksum_complete(skb))
Expand Down
1 change: 1 addition & 0 deletions net/sctp/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ int sctp_rcv(struct sk_buff *skb)

if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family))
goto discard_release;
nf_reset(skb);

ret = sk_filter(sk, skb, 1);
if (ret)
Expand Down

0 comments on commit b59c270

Please sign in to comment.