summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2000-06-09 18:54:41 +0000
committerJeremy Allison <jra@samba.org>2000-06-09 18:54:41 +0000
commiteab8f3c9405d108e4bc05f02a4a595bbb13ba403 (patch)
treed5dbfefaa4df19f85e4d17126c50046e5805fd10 /source3
parent03e0164270ffd7ceeb8df6f3cc3917c111dc05f8 (diff)
downloadsamba-eab8f3c9405d108e4bc05f02a4a595bbb13ba403.tar.gz
samba-eab8f3c9405d108e4bc05f02a4a595bbb13ba403.tar.bz2
samba-eab8f3c9405d108e4bc05f02a4a595bbb13ba403.zip
Fix from Elrond for hash table corruption. Should fix stat cache bug (I
sincerely hope :-). Thanks elrond ! Jeremy. (This used to be commit 0d59e8c6bf49e06f11b386f9d805474771365f52)
Diffstat (limited to 'source3')
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/lib/hash.c12
2 files changed, 11 insertions, 3 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index a5da95cd7d..9563b432fd 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -106,7 +106,7 @@ int string_hash(int hash_size, const char *key);
hash_element *hash_lookup(hash_table *table, char *key);
hash_element *hash_insert(hash_table *table, char *value, char *key);
void hash_remove(hash_table *table, hash_element *hash_elem);
-void hash_clear(hash_table *table);
+BOOL hash_clear(hash_table *table);
/*The following definitions come from lib/interface.c */
diff --git a/source3/lib/hash.c b/source3/lib/hash.c
index ccaf65b55a..cfb34a5488 100644
--- a/source3/lib/hash.c
+++ b/source3/lib/hash.c
@@ -61,7 +61,7 @@ BOOL hash_table_init(hash_table *table, int num_buckets, compare_function compar
table->size = 2;
table->comp_func = compare_func;
while (table->size < num_buckets)
- table->size <<= 1;
+ table->size <<= 1;
for (i = 0; i < NUM_PRIMES; i++) {
if (primes[i] > table->size) {
table->size = primes[i];
@@ -301,7 +301,7 @@ static BOOL enlarge_hash_table(hash_table *table)
*************************************************************************
*/
-void hash_clear(hash_table *table)
+BOOL hash_clear(hash_table *table)
{
int i;
ubi_dlList *bucket = table->buckets;
@@ -315,6 +315,14 @@ void hash_clear(hash_table *table)
free((char *)hash_elem);
}
}
+ table->size = 0;
if(table->buckets)
free((char *) table->buckets);
+ table->buckets = NULL;
+
+ /* Reinitialize the hash table. */
+ if(!hash_table_init(table, 0, table->comp_func))
+ return False;
+
+ return True;
}