diff options
author | Florian Westphal <fw@strlen.de> | 2015-10-09 13:10:37 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2015-10-13 12:03:24 +0200 |
commit | 7ceebfe46ec026b5405416b72772ac5aa9e09e84 (patch) | |
tree | 46d2704f24f8f975edc25da2b18797926afe6af1 | |
parent | 914eebf2f434c6c0355faa9d81b4ebdca94819c9 (diff) |
netfilter: nfqueue: don't use prev pointer
Usage of -prev seems buggy. While packet was out our hook cannot be
removed but we have no way to know if the previous one is still valid.
So better not use ->prev at all. Since NF_REPEAT just asks to invoke
same hook function again, just do so, and continue with nf_interate
if we get an ACCEPT verdict.
A side effect of this change is that if nf_reinject(NF_REPEAT) causes
another REPEAT we will now drop the skb instead of a kernel loop.
However, NF_REPEAT loops would be a bug so this should not happen anyway.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | net/netfilter/nf_queue.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index 34f628e16a4c..634d18e6ab2c 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c @@ -192,10 +192,8 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) nf_queue_entry_release_refs(entry); /* Continue traversal iff userspace said ok... */ - if (verdict == NF_REPEAT) { - elem = list_entry(elem->list.prev, struct nf_hook_ops, list); - verdict = NF_ACCEPT; - } + if (verdict == NF_REPEAT) + verdict = elem->hook(elem->priv, skb, &entry->state); if (verdict == NF_ACCEPT) { afinfo = nf_get_afinfo(entry->state.pf); |