From e0a8b6bede4641a7ee96bbf243594273032e465e Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Tue, 5 Aug 2008 21:25:47 +0200 Subject: [PATCH] Forgot to implement free() event for validator and interpreter extensions. --- src/lib-sieve/sieve-interpreter.c | 13 +++++++++++-- src/lib-sieve/sieve-validator.c | 10 ++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index 02aef7fc3..e5de43fa7 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 e131dcfe2..09b422c0b 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; -- GitLab