From 2684f1e61e8f6191b825f7d6d4df15027d20170d Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Sat, 15 Jan 2022 23:01:23 +0100 Subject: [PATCH] Fix copying hashmaps - len == 0 wasn't handled propery - Incorrect source k/v address - New object was never returned m( --- src/hashmap.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/hashmap.c b/src/hashmap.c index 837b21a..4d35ae3 100644 --- a/src/hashmap.c +++ b/src/hashmap.c @@ -341,6 +341,10 @@ apfl_hashmap_copy(apfl_hashmap src) struct bucket *dstbucket = &dst->buckets[i]; size_t len = srcbucket->len; + if (len == 0) { + continue; + } + dstbucket->keys = malloc(keysize * len); dstbucket->values = malloc(valsize * len); if (dstbucket->keys == NULL || dstbucket->values == NULL) { @@ -354,23 +358,25 @@ apfl_hashmap_copy(apfl_hashmap src) dstbucket->cap = len; - for (; dstbucket->len < len; dstbucket->len++) { - void *keyaddr = KVADDR(dstbucket->keys, keysize, dstbucket->len); - + for (size_t j = 0; j < len; j++) { copy_key( dst, - keyaddr, - KVADDR(srcbucket->keys, keysize, srcbucket->len) + KVADDR(dstbucket->keys, keysize, j), + KVADDR(srcbucket->keys, keysize, j) ); copy_value( dst, - KVADDR(dstbucket->values, valsize, dstbucket->len), - KVADDR(srcbucket->values, valsize, srcbucket->len) + KVADDR(dstbucket->values, valsize, j), + KVADDR(srcbucket->values, valsize, j) ); + + dstbucket->len++; } } + return dst; + fail: apfl_hashmap_destroy(dst); return NULL;