From 882e35b3ec7b5104852a8378b96ae5d087777e32 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Thu, 12 Feb 2009 01:14:52 +0100
Subject: [PATCH] Fixed bug the code generation of extensions.

---
 src/lib-sieve/sieve-binary.c     | 41 +++++++++++++++++++++-----------
 src/lib-sieve/sieve-extensions.c | 22 ++++++++---------
 2 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/src/lib-sieve/sieve-binary.c b/src/lib-sieve/sieve-binary.c
index c1f579568..3fe632a7b 100644
--- a/src/lib-sieve/sieve-binary.c
+++ b/src/lib-sieve/sieve-binary.c
@@ -1256,6 +1256,8 @@ static inline struct sieve_binary_extension_reg *
 	int index = array_count(&sbin->extensions);
 	struct sieve_binary_extension_reg *ereg;
 
+	if ( ext_id < 0 ) return NULL;
+
 	ereg = p_new(sbin->pool, struct sieve_binary_extension_reg, 1);
 	ereg->index = index;
 	ereg->extension = ext;
@@ -1292,7 +1294,8 @@ void sieve_binary_extension_set_context
 	struct sieve_binary_extension_reg *ereg = 
 		sieve_binary_extension_get_reg(sbin, ext, TRUE);
 	
-	ereg->context = context;
+	if ( ereg != NULL )
+		ereg->context = context;
 }
 
 const void *sieve_binary_extension_get_context
@@ -1315,10 +1318,12 @@ void sieve_binary_extension_set
 	struct sieve_binary_extension_reg *ereg = 
 		sieve_binary_extension_get_reg(sbin, bext->extension, TRUE);
 	
-	ereg->binext = bext;
+	if ( ereg != NULL ) {
+		ereg->binext = bext;
 
-	if ( context != NULL )
-		ereg->context = context;
+		if ( context != NULL )
+			ereg->context = context;
+	}
 }
 
 unsigned int sieve_binary_extension_create_block
@@ -1329,6 +1334,8 @@ unsigned int sieve_binary_extension_create_block
 	struct sieve_binary_extension_reg *ereg = 
 		sieve_binary_extension_get_reg(sbin, ext, TRUE);
 	
+	i_assert(ereg != NULL);
+
 	block = p_new(sbin->pool, struct sieve_binary_block, 1);
 	block->buffer = buffer_create_dynamic(sbin->pool, 64);
 
@@ -1347,6 +1354,8 @@ unsigned int sieve_binary_extension_get_block
 	struct sieve_binary_extension_reg *ereg = 
 		sieve_binary_extension_get_reg(sbin, ext, TRUE);
 		
+	i_assert(ereg != NULL);
+
 	return ereg->block_id;
 }
 
@@ -1354,17 +1363,18 @@ static inline int sieve_binary_extension_register
 (struct sieve_binary *sbin, const struct sieve_extension *ext, 
 	struct sieve_binary_extension_reg **reg_r) 
 {
-	if ( sieve_binary_extension_get_reg(sbin, ext, FALSE) == NULL ) {
-		struct sieve_binary_extension_reg *ereg = 
-			sieve_binary_extension_create_reg(sbin, ext);
+	struct sieve_binary_extension_reg *ereg;
+
+	if ( (ereg=sieve_binary_extension_get_reg(sbin, ext, FALSE)) == NULL ) {
+		ereg = sieve_binary_extension_create_reg(sbin, ext);
 		
+		if ( ereg == NULL ) return -1;
+
 		array_append(&sbin->linked_extensions, &ereg, 1);
-		
-		if ( reg_r != NULL ) *reg_r = ereg;
-		return ereg->index;
 	}
-	
-	return -1;
+
+	if ( reg_r != NULL ) *reg_r = ereg;
+	return ereg->index;
 }
 
 int sieve_binary_extension_link
@@ -1559,8 +1569,11 @@ sieve_size_t sieve_binary_emit_extension
 	unsigned int offset)
 {
 	sieve_size_t address = _sieve_binary_get_code_size(sbin);
-	struct sieve_binary_extension_reg *ereg = 
-		sieve_binary_extension_get_reg(sbin, ext, TRUE);
+	struct sieve_binary_extension_reg *ereg = NULL;
+
+	(void)sieve_binary_extension_register(sbin, ext, &ereg);
+
+	i_assert(ereg != NULL);
 
    	_sieve_binary_emit_byte(sbin, offset + ereg->index);
 	return address;
diff --git a/src/lib-sieve/sieve-extensions.c b/src/lib-sieve/sieve-extensions.c
index f9a1b3bc8..25f65e942 100644
--- a/src/lib-sieve/sieve-extensions.c
+++ b/src/lib-sieve/sieve-extensions.c
@@ -213,23 +213,21 @@ static struct sieve_extension_registration *_sieve_extension_register
     }
 
 	/* Enable extension */
-	if ( ereg->extension == NULL && extension != NULL ) {
-		if ( extension->_id != NULL && load ) {
-			/* Make sure extension is enabled */
-			*(extension->_id) = ereg->id;
-
-			/* Call load handler if extension was not loaded already */
-			if ( !ereg->loaded ) {
-				if ( !_sieve_extension_load(extension) )
-					return NULL;
-			}
+	if ( extension->_id != NULL && load ) {
+		/* Make sure extension is enabled */
+		*(extension->_id) = ereg->id;
 
-			ereg->loaded = TRUE;
+		/* Call load handler if extension was not loaded already */
+		if ( !ereg->loaded ) {
+			if ( !_sieve_extension_load(extension) )
+				return NULL;
 		}
 
-		ereg->extension = extension;
+		ereg->loaded = TRUE;
 	}
 
+	ereg->extension = extension;
+
 	return ereg;
 }
 
-- 
GitLab