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 | }; |
