Skip to content

Commit f82777e

Browse files
Florian Westphalummakynes
authored andcommitted
netfilter: nfnetlink_queue: un-break NF_REPEAT
Only override userspace verdict if the ct hook returns something other than ACCEPT. Else, this replaces NF_REPEAT (run all hooks again) with NF_ACCEPT (move to next hook). Fixes: 6291b3a ("netfilter: conntrack: convert nf_conntrack_update to netfilter verdicts") Reported-by: [email protected] Signed-off-by: Florian Westphal <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 7395dfa commit f82777e

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

net/netfilter/nfnetlink_queue.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,25 @@ static void nfqnl_reinject(struct nf_queue_entry *entry, unsigned int verdict)
232232
if (verdict == NF_ACCEPT ||
233233
verdict == NF_REPEAT ||
234234
verdict == NF_STOP) {
235+
unsigned int ct_verdict = verdict;
236+
235237
rcu_read_lock();
236238
ct_hook = rcu_dereference(nf_ct_hook);
237239
if (ct_hook)
238-
verdict = ct_hook->update(entry->state.net, entry->skb);
240+
ct_verdict = ct_hook->update(entry->state.net, entry->skb);
239241
rcu_read_unlock();
240242

241-
switch (verdict & NF_VERDICT_MASK) {
243+
switch (ct_verdict & NF_VERDICT_MASK) {
244+
case NF_ACCEPT:
245+
/* follow userspace verdict, could be REPEAT */
246+
break;
242247
case NF_STOLEN:
243248
nf_queue_entry_free(entry);
244249
return;
250+
default:
251+
verdict = ct_verdict & NF_VERDICT_MASK;
252+
break;
245253
}
246-
247254
}
248255
nf_reinject(entry, verdict);
249256
}

0 commit comments

Comments
 (0)