From 57747dfc454c33f83daebbe1007502c718593836 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Wed, 14 Feb 2018 11:45:20 +0000 Subject: [Fix] Fix deletion from hash --- contrib/libucl/ucl_hash.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'contrib/libucl') diff --git a/contrib/libucl/ucl_hash.c b/contrib/libucl/ucl_hash.c index ce2a4fdb5..92c8b3933 100644 --- a/contrib/libucl/ucl_hash.c +++ b/contrib/libucl/ucl_hash.c @@ -368,6 +368,7 @@ ucl_hash_delete (ucl_hash_t* hashlin, const ucl_object_t *obj) { khiter_t k; struct ucl_hash_elt *elt; + size_t i; if (hashlin == NULL) { return; @@ -380,8 +381,15 @@ ucl_hash_delete (ucl_hash_t* hashlin, const ucl_object_t *obj) k = kh_get (ucl_hash_caseless_node, h, obj); if (k != kh_end (h)) { elt = &kh_value (h, k); + i = elt->ar_idx; kv_del (const ucl_object_t *, hashlin->ar, elt->ar_idx); kh_del (ucl_hash_caseless_node, h, k); + + /* Update subsequent elts */ + for (; i < hashlin->ar.n; i ++) { + elt = &kh_value (h, i); + elt->ar_idx --; + } } } else { @@ -390,8 +398,15 @@ ucl_hash_delete (ucl_hash_t* hashlin, const ucl_object_t *obj) k = kh_get (ucl_hash_node, h, obj); if (k != kh_end (h)) { elt = &kh_value (h, k); + i = elt->ar_idx; kv_del (const ucl_object_t *, hashlin->ar, elt->ar_idx); kh_del (ucl_hash_node, h, k); + + /* Update subsequent elts */ + for (; i < hashlin->ar.n; i ++) { + elt = &kh_value (h, i); + elt->ar_idx --; + } } } } -- cgit v1.2.3