diff --git a/src/lib-sieve/plugins/variables/ext-variables-dump.c b/src/lib-sieve/plugins/variables/ext-variables-dump.c index b574ea38bc084d92577164b38276f12418cb6487..25cf5be8eca70144fefa14b72bfe3b4437dd9af1 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-dump.c +++ b/src/lib-sieve/plugins/variables/ext-variables-dump.c @@ -19,7 +19,8 @@ static void ext_variables_code_dumper_free (struct sieve_code_dumper *dumper, void *context); -const struct sieve_code_dumper_extension variables_dump_extension = { +static const struct sieve_code_dumper_extension +variables_dump_extension = { &variables_extension, ext_variables_code_dumper_free }; @@ -62,7 +63,8 @@ static struct ext_variables_dump_context *ext_variables_dump_get_context p_array_init(&dctx->ext_scopes, pool, sieve_extensions_get_count(this_ext->svinst)); - sieve_dump_extension_set_context(dumper, this_ext, dctx); + sieve_dump_extension_register + (dumper, this_ext, &variables_dump_extension, dctx); } return dctx; diff --git a/src/lib-sieve/sieve-code-dumper.c b/src/lib-sieve/sieve-code-dumper.c index a07d4c79b7e014f99f6f480a4b7b14ca6adae779..de444169cfaf298edf01ea6e1e507ebf0bf3e567 100644 --- a/src/lib-sieve/sieve-code-dumper.c +++ b/src/lib-sieve/sieve-code-dumper.c @@ -67,12 +67,23 @@ struct sieve_code_dumper *sieve_code_dumper_create return cdumper; } -void sieve_code_dumper_free(struct sieve_code_dumper **cdumper) +void sieve_code_dumper_free(struct sieve_code_dumper **_cdumper) { - sieve_binary_debug_reader_deinit(&(*cdumper)->dreader); + struct sieve_code_dumper *cdumper = *_cdumper; + const struct sieve_code_dumper_extension_reg *eregs; + unsigned int count, i; - pool_unref(&((*cdumper)->pool)); - *cdumper = NULL; + sieve_binary_debug_reader_deinit(&cdumper->dreader); + + /* Signal registered extensions that the dumper is being destroyed */ + eregs = array_get(&cdumper->extensions, &count); + for ( i = 0; i < count; i++ ) { + if ( eregs[i].cdmpext != NULL && eregs[i].cdmpext->free != NULL ) + eregs[i].cdmpext->free(cdumper, eregs[i].context); + } + + pool_unref(&cdumper->pool); + *_cdumper = NULL; } pool_t sieve_code_dumper_pool(struct sieve_code_dumper *cdumper) diff --git a/src/lib-sieve/sieve-code-dumper.h b/src/lib-sieve/sieve-code-dumper.h index 4070e09a558b875c3d9b97d8a64f7bb23364d90a..05d0bc812a78fd10ebf155d7b1bb09440f2d5edf 100644 --- a/src/lib-sieve/sieve-code-dumper.h +++ b/src/lib-sieve/sieve-code-dumper.h @@ -11,7 +11,7 @@ struct sieve_code_dumper; struct sieve_code_dumper *sieve_code_dumper_create (struct sieve_dumptime_env *denv); void sieve_code_dumper_free - (struct sieve_code_dumper **dumper); + (struct sieve_code_dumper **_dumper); pool_t sieve_code_dumper_pool (struct sieve_code_dumper *dumper);