diff options
author | Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp> | 2006-04-24 20:15:17 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-04-24 20:27:28 -0400 |
commit | e1bbdebdba615ddd957de81103aa2f7fa0581952 (patch) | |
tree | 58db2991440cfeca18678bdeed5dd45d38b186bb | |
parent | d8fe3f19203b1f5070358aaa292d33295258b448 (diff) |
[NETFILTER]: nf_conntrack: Fix module refcount dropping too far
If nf_ct_l3proto_find_get() fails to get the refcount of
nf_ct_l3proto_generic, nf_ct_l3proto_put() will drop the refcount
too far.
This gets rid of '.me = THIS_MODULE' of nf_ct_l3proto_generic so that
nf_ct_l3proto_find_get() doesn't try to get refcount of it.
It's OK because its symbol is usable until nf_conntrack.ko is unloaded.
This also kills unnecessary NULL pointer check as well.
__nf_ct_proto_find() allways returns non-NULL pointer.
Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/netfilter/nf_conntrack_core.c | 12 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_l3proto_generic.c | 1 |
2 files changed, 4 insertions, 9 deletions
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index e581190fb6c3..e3022226a408 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -208,10 +208,8 @@ nf_ct_proto_find_get(u_int16_t l3proto, u_int8_t protocol) | |||
208 | 208 | ||
209 | preempt_disable(); | 209 | preempt_disable(); |
210 | p = __nf_ct_proto_find(l3proto, protocol); | 210 | p = __nf_ct_proto_find(l3proto, protocol); |
211 | if (p) { | 211 | if (!try_module_get(p->me)) |
212 | if (!try_module_get(p->me)) | 212 | p = &nf_conntrack_generic_protocol; |
213 | p = &nf_conntrack_generic_protocol; | ||
214 | } | ||
215 | preempt_enable(); | 213 | preempt_enable(); |
216 | 214 | ||
217 | return p; | 215 | return p; |
@@ -229,10 +227,8 @@ nf_ct_l3proto_find_get(u_int16_t l3proto) | |||
229 | 227 | ||
230 | preempt_disable(); | 228 | preempt_disable(); |
231 | p = __nf_ct_l3proto_find(l3proto); | 229 | p = __nf_ct_l3proto_find(l3proto); |
232 | if (p) { | 230 | if (!try_module_get(p->me)) |
233 | if (!try_module_get(p->me)) | 231 | p = &nf_conntrack_generic_l3proto; |
234 | p = &nf_conntrack_generic_l3proto; | ||
235 | } | ||
236 | preempt_enable(); | 232 | preempt_enable(); |
237 | 233 | ||
238 | return p; | 234 | return p; |
diff --git a/net/netfilter/nf_conntrack_l3proto_generic.c b/net/netfilter/nf_conntrack_l3proto_generic.c index 7de4f06c63c5..3fc58e454d4e 100644 --- a/net/netfilter/nf_conntrack_l3proto_generic.c +++ b/net/netfilter/nf_conntrack_l3proto_generic.c | |||
@@ -94,5 +94,4 @@ struct nf_conntrack_l3proto nf_conntrack_generic_l3proto = { | |||
94 | .print_conntrack = generic_print_conntrack, | 94 | .print_conntrack = generic_print_conntrack, |
95 | .prepare = generic_prepare, | 95 | .prepare = generic_prepare, |
96 | .get_features = generic_get_features, | 96 | .get_features = generic_get_features, |
97 | .me = THIS_MODULE, | ||
98 | }; | 97 | }; |