diff options
author | Florian Westphal <fw@strlen.de> | 2015-10-13 08:33:27 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2015-10-16 12:22:23 -0400 |
commit | ed78d09d59ba9764b7454e8e1ccbb0072a55b6d7 (patch) | |
tree | 1971277eedd1743779e29f66a1ddb741976bec27 /net/netfilter | |
parent | 2ffbceb2b08f8ca0496c54a9ebcd11d25275954e (diff) |
netfilter: make nf_queue_entry_get_refs return void
We don't care if module is being unloaded anymore since hook unregister
handling will destroy queue entries using that hook.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/netfilter')
-rw-r--r-- | net/netfilter/core.c | 2 | ||||
-rw-r--r-- | net/netfilter/nf_queue.c | 11 | ||||
-rw-r--r-- | net/netfilter/nfnetlink_queue.c | 11 |
3 files changed, 6 insertions, 18 deletions
diff --git a/net/netfilter/core.c b/net/netfilter/core.c index 32a289420caf..09e661c3ae58 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c | |||
@@ -313,8 +313,6 @@ next_hook: | |||
313 | int err = nf_queue(skb, elem, state, | 313 | int err = nf_queue(skb, elem, state, |
314 | verdict >> NF_VERDICT_QBITS); | 314 | verdict >> NF_VERDICT_QBITS); |
315 | if (err < 0) { | 315 | if (err < 0) { |
316 | if (err == -ECANCELED) | ||
317 | goto next_hook; | ||
318 | if (err == -ESRCH && | 316 | if (err == -ESRCH && |
319 | (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS)) | 317 | (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS)) |
320 | goto next_hook; | 318 | goto next_hook; |
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index eef1c50e0e21..efc968807199 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c | |||
@@ -73,7 +73,7 @@ void nf_queue_entry_release_refs(struct nf_queue_entry *entry) | |||
73 | EXPORT_SYMBOL_GPL(nf_queue_entry_release_refs); | 73 | EXPORT_SYMBOL_GPL(nf_queue_entry_release_refs); |
74 | 74 | ||
75 | /* Bump dev refs so they don't vanish while packet is out */ | 75 | /* Bump dev refs so they don't vanish while packet is out */ |
76 | bool nf_queue_entry_get_refs(struct nf_queue_entry *entry) | 76 | void nf_queue_entry_get_refs(struct nf_queue_entry *entry) |
77 | { | 77 | { |
78 | struct nf_hook_state *state = &entry->state; | 78 | struct nf_hook_state *state = &entry->state; |
79 | 79 | ||
@@ -95,8 +95,6 @@ bool nf_queue_entry_get_refs(struct nf_queue_entry *entry) | |||
95 | dev_hold(physdev); | 95 | dev_hold(physdev); |
96 | } | 96 | } |
97 | #endif | 97 | #endif |
98 | |||
99 | return true; | ||
100 | } | 98 | } |
101 | EXPORT_SYMBOL_GPL(nf_queue_entry_get_refs); | 99 | EXPORT_SYMBOL_GPL(nf_queue_entry_get_refs); |
102 | 100 | ||
@@ -151,10 +149,7 @@ int nf_queue(struct sk_buff *skb, | |||
151 | .size = sizeof(*entry) + afinfo->route_key_size, | 149 | .size = sizeof(*entry) + afinfo->route_key_size, |
152 | }; | 150 | }; |
153 | 151 | ||
154 | if (!nf_queue_entry_get_refs(entry)) { | 152 | nf_queue_entry_get_refs(entry); |
155 | status = -ECANCELED; | ||
156 | goto err_unlock; | ||
157 | } | ||
158 | skb_dst_force(skb); | 153 | skb_dst_force(skb); |
159 | afinfo->saveroute(skb, entry); | 154 | afinfo->saveroute(skb, entry); |
160 | status = qh->outfn(entry, queuenum); | 155 | status = qh->outfn(entry, queuenum); |
@@ -215,8 +210,6 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) | |||
215 | err = nf_queue(skb, elem, &entry->state, | 210 | err = nf_queue(skb, elem, &entry->state, |
216 | verdict >> NF_VERDICT_QBITS); | 211 | verdict >> NF_VERDICT_QBITS); |
217 | if (err < 0) { | 212 | if (err < 0) { |
218 | if (err == -ECANCELED) | ||
219 | goto next_hook; | ||
220 | if (err == -ESRCH && | 213 | if (err == -ESRCH && |
221 | (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS)) | 214 | (verdict & NF_VERDICT_FLAG_QUEUE_BYPASS)) |
222 | goto next_hook; | 215 | goto next_hook; |
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index a659e57aa576..7d81d280cb4f 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
@@ -606,12 +606,9 @@ static struct nf_queue_entry * | |||
606 | nf_queue_entry_dup(struct nf_queue_entry *e) | 606 | nf_queue_entry_dup(struct nf_queue_entry *e) |
607 | { | 607 | { |
608 | struct nf_queue_entry *entry = kmemdup(e, e->size, GFP_ATOMIC); | 608 | struct nf_queue_entry *entry = kmemdup(e, e->size, GFP_ATOMIC); |
609 | if (entry) { | 609 | if (entry) |
610 | if (nf_queue_entry_get_refs(entry)) | 610 | nf_queue_entry_get_refs(entry); |
611 | return entry; | 611 | return entry; |
612 | kfree(entry); | ||
613 | } | ||
614 | return NULL; | ||
615 | } | 612 | } |
616 | 613 | ||
617 | #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) | 614 | #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) |
@@ -706,7 +703,7 @@ nfqnl_enqueue_packet(struct nf_queue_entry *entry, unsigned int queuenum) | |||
706 | nf_bridge_adjust_skb_data(skb); | 703 | nf_bridge_adjust_skb_data(skb); |
707 | segs = skb_gso_segment(skb, 0); | 704 | segs = skb_gso_segment(skb, 0); |
708 | /* Does not use PTR_ERR to limit the number of error codes that can be | 705 | /* Does not use PTR_ERR to limit the number of error codes that can be |
709 | * returned by nf_queue. For instance, callers rely on -ECANCELED to | 706 | * returned by nf_queue. For instance, callers rely on -ESRCH to |
710 | * mean 'ignore this hook'. | 707 | * mean 'ignore this hook'. |
711 | */ | 708 | */ |
712 | if (IS_ERR_OR_NULL(segs)) | 709 | if (IS_ERR_OR_NULL(segs)) |