summaryrefslogtreecommitdiff
path: root/mysys/hash.c
diff options
context:
space:
mode:
authorV Narayanan <v.narayanan@sun.com>2009-06-19 17:29:21 +0530
committerV Narayanan <v.narayanan@sun.com>2009-06-19 17:29:21 +0530
commit728d3c39de931d268db9218fbbf1028d90154758 (patch)
tree434ed5bfe3e137ce745b237f9baacff9adc34715 /mysys/hash.c
parent2b48caa42dc69a802598dcf165226c98434c9598 (diff)
downloadmariadb-git-728d3c39de931d268db9218fbbf1028d90154758.tar.gz
Bug#43572 Handle failures from hash_init
Failure to allocate memory for the hash->array element, caused hash_init to return without initializing the other members of the hash. Thus although the dynamic array buffer may be allocated at a later point in the code, the incompletely initialized hash caused fatal failures. This patch moves the initialization of the other members of the hash above the array allocation, so that the usage of this hash will not result in fatal failures.
Diffstat (limited to 'mysys/hash.c')
-rw-r--r--mysys/hash.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/mysys/hash.c b/mysys/hash.c
index 9e8404248eb..4aab75609f4 100644
--- a/mysys/hash.c
+++ b/mysys/hash.c
@@ -45,6 +45,32 @@ static uint calc_hash(const HASH *hash, const byte *key, uint length)
return nr1;
}
+/**
+ @brief Initialize the hash
+
+ @details
+
+ Initialize the hash, by defining and giving valid values for
+ its elements. The failure to allocate memory for the
+ hash->array element will not result in a fatal failure. The
+ dynamic array that is part of the hash will allocate memory
+ as required during insertion.
+
+ @param[in,out] hash The hash that is initialized
+ @param[in] charset The charater set information
+ @param[in] size The hash size
+ @param[in] key_offest The key offset for the hash
+ @param[in] key_length The length of the key used in
+ the hash
+ @param[in] get_key get the key for the hash
+ @param[in] free_element pointer to the function that
+ does cleanup
+ @param[in] CALLER_INFO_PROTO flag that define the behaviour
+ of the hash
+ @return inidicates success or failure of initialization
+ @retval 0 success
+ @retval 1 failure
+*/
my_bool
_hash_init(HASH *hash,CHARSET_INFO *charset,
uint size,uint key_offset,uint key_length,
@@ -55,11 +81,6 @@ _hash_init(HASH *hash,CHARSET_INFO *charset,
DBUG_PRINT("enter",("hash: 0x%lx size: %d", (long) hash, size));
hash->records=0;
- if (my_init_dynamic_array_ci(&hash->array,sizeof(HASH_LINK),size,0))
- {
- hash->free=0; /* Allow call to hash_free */
- DBUG_RETURN(1);
- }
hash->key_offset=key_offset;
hash->key_length=key_length;
hash->blength=1;
@@ -67,7 +88,8 @@ _hash_init(HASH *hash,CHARSET_INFO *charset,
hash->free=free_element;
hash->flags=flags;
hash->charset=charset;
- DBUG_RETURN(0);
+ DBUG_RETURN(my_init_dynamic_array_ci(&hash->array,
+ sizeof(HASH_LINK), size, 0));
}
@@ -113,6 +135,7 @@ void hash_free(HASH *hash)
hash_free_elements(hash);
hash->free= 0;
delete_dynamic(&hash->array);
+ hash->blength= 0;
DBUG_VOID_RETURN;
}