dovecot-2.2-pigeonhole: lib-sieve: Fixed memory leak in code dum...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sun Nov 29 20:33:39 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/168b6eb4671e
changeset: 2154:168b6eb4671e
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Nov 29 21:33:33 2015 +0100
description:
lib-sieve: Fixed memory leak in code dumper.
The free handler of code dumper extensions was never executed.

diffstat:

 src/lib-sieve/plugins/variables/ext-variables-dump.c |   6 ++++--
 src/lib-sieve/sieve-code-dumper.c                    |  19 +++++++++++++++----
 src/lib-sieve/sieve-code-dumper.h                    |   2 +-
 3 files changed, 20 insertions(+), 7 deletions(-)

diffs (66 lines):

diff -r e4f181199457 -r 168b6eb4671e src/lib-sieve/plugins/variables/ext-variables-dump.c
--- a/src/lib-sieve/plugins/variables/ext-variables-dump.c	Sun Nov 29 20:01:09 2015 +0100
+++ b/src/lib-sieve/plugins/variables/ext-variables-dump.c	Sun Nov 29 21:33:33 2015 +0100
@@ -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 @@
 		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 -r e4f181199457 -r 168b6eb4671e src/lib-sieve/sieve-code-dumper.c
--- a/src/lib-sieve/sieve-code-dumper.c	Sun Nov 29 20:01:09 2015 +0100
+++ b/src/lib-sieve/sieve-code-dumper.c	Sun Nov 29 21:33:33 2015 +0100
@@ -67,12 +67,23 @@
 	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 -r e4f181199457 -r 168b6eb4671e src/lib-sieve/sieve-code-dumper.h
--- a/src/lib-sieve/sieve-code-dumper.h	Sun Nov 29 20:01:09 2015 +0100
+++ b/src/lib-sieve/sieve-code-dumper.h	Sun Nov 29 21:33:33 2015 +0100
@@ -11,7 +11,7 @@
 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);
 


More information about the dovecot-cvs mailing list