From: Vsevolod Stakhov Date: Wed, 14 Feb 2018 11:45:20 +0000 (+0000) Subject: [Fix] Fix deletion from hash X-Git-Tag: 1.7.0~188 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=57747dfc454c33f83daebbe1007502c718593836;p=thirdparty%2Frspamd.git [Fix] Fix deletion from hash --- diff --git a/contrib/libucl/ucl_hash.c b/contrib/libucl/ucl_hash.c index ce2a4fdb5a..92c8b3933c 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 --; + } } } }