summaryrefslogtreecommitdiff
path: root/p11-kit/hashmap.c
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2013-01-07 09:20:25 +0100
committerStef Walter <stefw@gnome.org>2013-01-07 09:31:02 +0100
commite2b5bba185c96bf4ecddfe22d34ace02706122b4 (patch)
tree9cf3802c14a43956acac951e444ce632ee36ffd8 /p11-kit/hashmap.c
parent1559a3e43637406c8b56e880ba00c96bdd16462c (diff)
Guarantee that the key is freed when replaced
* When setting a key in a map that already exists, then free the old key and replace with the new one. * Fix related bug where key was not properly allocated * Add tests for this https://bugs.freedesktop.org/show_bug.cgi?id=59087
Diffstat (limited to 'p11-kit/hashmap.c')
-rw-r--r--p11-kit/hashmap.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/p11-kit/hashmap.c b/p11-kit/hashmap.c
index 1c4aff1..d420221 100644
--- a/p11-kit/hashmap.c
+++ b/p11-kit/hashmap.c
@@ -157,11 +157,16 @@ _p11_hash_set (hashmap *map,
bucketp = lookup_or_create_bucket (map, key, 1);
if(bucketp && *bucketp) {
+ /* Destroy the previous key */
+ if ((*bucketp)->key && (*bucketp)->key != key && map->key_destroy_func)
+ map->key_destroy_func ((*bucketp)->key);
+
/* Destroy the previous value */
- if ((*bucketp)->value && map->value_destroy_func)
+ if ((*bucketp)->value && (*bucketp)->value != val && map->value_destroy_func)
map->value_destroy_func ((*bucketp)->value);
/* replace entry */
+ (*bucketp)->key = key;
(*bucketp)->value = val;
/* check that the collision rate isn't too high */