diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c index 9632078cf3d8f845fd984f08eedf5d46cc590ade..2c3936c9424f1657e5fd7588b0cbb277102efcac 100644 --- a/src/lib-sieve/sieve-extensions.c +++ b/src/lib-sieve/sieve-extensions.c @@ -269,21 +269,16 @@ static void sieve_extension_registry_init(struct sieve_instance *svinst) static void sieve_extension_registry_deinit(struct sieve_instance *svinst) { struct sieve_extension_registry *ext_reg = svinst->ext_reg; - struct hash_iterate_context *itx; - void *key; - void *value; + struct sieve_extension *exts; + unsigned int i, ext_count; if ( ext_reg->extension_index == NULL ) return; - itx = hash_table_iterate_init(ext_reg->extension_index); - while ( hash_table_iterate(itx, &key, &value) ) { - struct sieve_extension *ext = (struct sieve_extension *) value; - - _sieve_extension_unload(ext); + exts = array_get_modifiable(&ext_reg->extensions, &ext_count); + for ( i = 0; i < ext_count; i++ ) { + _sieve_extension_unload(&exts[i]); } - hash_table_iterate_deinit(&itx); - hash_table_destroy(&ext_reg->extension_index); } @@ -363,10 +358,10 @@ void sieve_extension_unregister(const struct sieve_extension *ext) struct sieve_extension *mod_ext; int ext_id = ext->id; - if ( ext_id > 0 && ext_id < (int) array_count(&ext_reg->extensions) ) { + if ( ext_id >= 0 && ext_id < (int) array_count(&ext_reg->extensions) ) { mod_ext = array_idx_modifiable(&ext_reg->extensions, ext_id); - sieve_extension_capabilities_unregister(ext); + sieve_extension_capabilities_unregister(mod_ext); _sieve_extension_unload(mod_ext); mod_ext->loaded = FALSE; mod_ext->def = NULL;