diff options
author | Changli Gao <xiaosuo@gmail.com> | 2011-03-15 08:26:32 -0400 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2011-03-15 08:26:32 -0400 |
commit | 4656c4d61adb8dc3ee04c08f57a5cc7598814420 (patch) | |
tree | 03c01d2bf4e56fa33ede99f8128839727d3878af /net | |
parent | 3e0d5149e6dcbe7111a63773a07c5b33f7ca7236 (diff) |
netfilter: xt_connlimit: remove connlimit_rnd_inited
A potential race condition when generating connlimit_rnd is also fixed.
Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/xt_connlimit.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c index da56d6ec13c9..c6d5a83450c9 100644 --- a/net/netfilter/xt_connlimit.c +++ b/net/netfilter/xt_connlimit.c | |||
@@ -44,7 +44,6 @@ struct xt_connlimit_data { | |||
44 | }; | 44 | }; |
45 | 45 | ||
46 | static u_int32_t connlimit_rnd __read_mostly; | 46 | static u_int32_t connlimit_rnd __read_mostly; |
47 | static bool connlimit_rnd_inited __read_mostly; | ||
48 | 47 | ||
49 | static inline unsigned int connlimit_iphash(__be32 addr) | 48 | static inline unsigned int connlimit_iphash(__be32 addr) |
50 | { | 49 | { |
@@ -226,9 +225,13 @@ static int connlimit_mt_check(const struct xt_mtchk_param *par) | |||
226 | unsigned int i; | 225 | unsigned int i; |
227 | int ret; | 226 | int ret; |
228 | 227 | ||
229 | if (unlikely(!connlimit_rnd_inited)) { | 228 | if (unlikely(!connlimit_rnd)) { |
230 | get_random_bytes(&connlimit_rnd, sizeof(connlimit_rnd)); | 229 | u_int32_t rand; |
231 | connlimit_rnd_inited = true; | 230 | |
231 | do { | ||
232 | get_random_bytes(&rand, sizeof(rand)); | ||
233 | } while (!rand); | ||
234 | cmpxchg(&connlimit_rnd, 0, rand); | ||
232 | } | 235 | } |
233 | ret = nf_ct_l3proto_try_module_get(par->family); | 236 | ret = nf_ct_l3proto_try_module_get(par->family); |
234 | if (ret < 0) { | 237 | if (ret < 0) { |