Skip to content

Commit b59c270

Browse files
kaberDavid S. Miller
authored andcommitted
[NETFILTER]: Keep conntrack reference until IPsec policy checks are done
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>
1 parent 5c901da commit b59c270

File tree

6 files changed

+12
-9
lines changed

6 files changed

+12
-9
lines changed

net/dccp/ipv4.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,7 @@ int dccp_v4_destroy_sock(struct sock *sk)
10991099
kfree_skb(sk->sk_send_head);
11001100
sk->sk_send_head = NULL;
11011101
}
1102+
nf_reset(skb);
11021103

11031104
/* Clean up a referenced DCCP bind bucket. */
11041105
if (inet_csk(sk)->icsk_bind_hash != NULL)

net/ipv4/ip_input.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ int ip_call_ra_chain(struct sk_buff *skb)
185185
raw_rcv(last, skb2);
186186
}
187187
last = sk;
188-
nf_reset(skb);
189188
}
190189
}
191190

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

205204
__skb_pull(skb, ihl);
206205

207-
/* Free reference early: we don't need it any more, and it may
208-
hold ip_conntrack module loaded indefinitely. */
209-
nf_reset(skb);
210-
211206
/* Point into the IP datagram, just past the header. */
212207
skb->h.raw = skb->data;
213208

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

235-
if (!ipprot->no_policy &&
236-
!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
237-
kfree_skb(skb);
238-
goto out;
230+
if (!ipprot->no_policy) {
231+
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
232+
kfree_skb(skb);
233+
goto out;
234+
}
235+
nf_reset(skb);
239236
}
240237
ret = ipprot->handler(skb);
241238
if (ret < 0) {

net/ipv4/raw.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
255255
kfree_skb(skb);
256256
return NET_RX_DROP;
257257
}
258+
nf_reset(skb);
258259

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

net/ipv4/tcp_ipv4.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
10801080

10811081
if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
10821082
goto discard_and_relse;
1083+
nf_reset(skb);
10831084

10841085
if (sk_filter(sk, skb, 0))
10851086
goto discard_and_relse;

net/ipv4/udp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,7 @@ static int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb)
989989
kfree_skb(skb);
990990
return -1;
991991
}
992+
nf_reset(skb);
992993

993994
if (up->encap_type) {
994995
/*
@@ -1149,6 +1150,7 @@ int udp_rcv(struct sk_buff *skb)
11491150

11501151
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
11511152
goto drop;
1153+
nf_reset(skb);
11521154

11531155
/* No socket. Drop packet silently, if checksum is wrong */
11541156
if (udp_checksum_complete(skb))

net/sctp/input.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ int sctp_rcv(struct sk_buff *skb)
225225

226226
if (!xfrm_policy_check(sk, XFRM_POLICY_IN, skb, family))
227227
goto discard_release;
228+
nf_reset(skb);
228229

229230
ret = sk_filter(sk, skb, 1);
230231
if (ret)

0 commit comments

Comments
 (0)