diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 02aef7fc393e3c43b4dfc94b49a2a11db4fcaf41..e5de43fa7ed40e5e72f86ae0852d4a5e1173da03 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -103,15 +103,24 @@ struct sieve_interpreter *sieve_interpreter_create void sieve_interpreter_free(struct sieve_interpreter **interp) { + const struct sieve_interpreter_extension_reg *extrs; + unsigned int ext_count, i; + sieve_binary_unref(&(*interp)->runenv.sbin); if ( (*interp)->runenv.msgctx != NULL ) sieve_message_context_unref(&(*interp)->runenv.msgctx); sieve_error_handler_unref(&(*interp)->ehandler); + + /* Signal registered extensions that the validator is being destroyed */ + extrs = array_get(&(*interp)->extensions, &ext_count); + for ( i = 0; i < ext_count; i++ ) { + if ( extrs[i].int_ext != NULL && extrs[i].int_ext->free != NULL ) + extrs[i].int_ext->free(*interp, extrs[i].context); + } - pool_unref(&((*interp)->pool)); - + pool_unref(&((*interp)->pool)); *interp = NULL; } diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c index e131dcfe227ff6879c86e6af6b591d7106b6d07e..09b422c0b3d31b7d42626ce948a5f10c529a0125 100644 --- a/src/lib-sieve/sieve-validator.c +++ b/src/lib-sieve/sieve-validator.c @@ -145,11 +145,21 @@ struct sieve_validator *sieve_validator_create void sieve_validator_free(struct sieve_validator **validator) { + const struct sieve_validator_extension_reg *extrs; + unsigned int ext_count, i; + hash_destroy(&(*validator)->commands); sieve_ast_unref(&(*validator)->ast); sieve_error_handler_unref(&(*validator)->ehandler); + /* Signal registered extensions that the validator is being destroyed */ + extrs = array_get(&(*validator)->extensions, &ext_count); + for ( i = 0; i < ext_count; i++ ) { + if ( extrs[i].val_ext != NULL && extrs[i].val_ext->free != NULL ) + extrs[i].val_ext->free(*validator, extrs[i].context); + } + pool_unref(&(*validator)->pool); *validator = NULL;