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 | |
| 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')
| -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)) |
