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