aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/netfilter/ipt_hashlimit.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/net/ipv4/netfilter/ipt_hashlimit.c b/net/ipv4/netfilter/ipt_hashlimit.c
index 85edfb79469a..92980ab8ce48 100644
--- a/net/ipv4/netfilter/ipt_hashlimit.c
+++ b/net/ipv4/netfilter/ipt_hashlimit.c
@@ -80,6 +80,7 @@ struct ipt_hashlimit_htable {
80 /* used internally */ 80 /* used internally */
81 spinlock_t lock; /* lock for list_head */ 81 spinlock_t lock; /* lock for list_head */
82 u_int32_t rnd; /* random seed for hash */ 82 u_int32_t rnd; /* random seed for hash */
83 int rnd_initialized;
83 struct timer_list timer; /* timer for gc */ 84 struct timer_list timer; /* timer for gc */
84 atomic_t count; /* number entries in table */ 85 atomic_t count; /* number entries in table */
85 86
@@ -134,8 +135,10 @@ __dsthash_alloc_init(struct ipt_hashlimit_htable *ht, struct dsthash_dst *dst)
134 135
135 /* initialize hash with random val at the time we allocate 136 /* initialize hash with random val at the time we allocate
136 * the first hashtable entry */ 137 * the first hashtable entry */
137 if (!ht->rnd) 138 if (!ht->rnd_initialized) {
138 get_random_bytes(&ht->rnd, 4); 139 get_random_bytes(&ht->rnd, 4);
140 ht->rnd_initialized = 1;
141 }
139 142
140 if (ht->cfg.max && 143 if (ht->cfg.max &&
141 atomic_read(&ht->count) >= ht->cfg.max) { 144 atomic_read(&ht->count) >= ht->cfg.max) {
@@ -214,7 +217,7 @@ static int htable_create(struct ipt_hashlimit_info *minfo)
214 217
215 atomic_set(&hinfo->count, 0); 218 atomic_set(&hinfo->count, 0);
216 atomic_set(&hinfo->use, 1); 219 atomic_set(&hinfo->use, 1);
217 hinfo->rnd = 0; 220 hinfo->rnd_initialized = 0;
218 spin_lock_init(&hinfo->lock); 221 spin_lock_init(&hinfo->lock);
219 hinfo->pde = create_proc_entry(minfo->name, 0, hashlimit_procdir); 222 hinfo->pde = create_proc_entry(minfo->name, 0, hashlimit_procdir);
220 if (!hinfo->pde) { 223 if (!hinfo->pde) {