From 27317986cced98ac422f97008cb9a56a4f67413e Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sun, 12 Apr 2009 15:01:45 +0200
Subject: [PATCH] Environment: fixed segfault and fixed some rfc deviations.

---
 Makefile.am                                   |  1 +
 .../environment/ext-environment-common.c      |  2 +-
 .../plugins/environment/tst-environment.c     | 25 +++++++++++--------
 3 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 294e2326a..4da531e06 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -84,6 +84,7 @@ test_cases = \
 	tests/extensions/enotify/execute.svtest \
 	tests/extensions/enotify/mailto.svtest \
 	tests/extensions/environment/basic.svtest \
+	tests/extensions/environment/rfc.svtest \
 	tests/multiscript/basic.svtest
 
 if HAVE_DOVECOT_LIBS
diff --git a/src/lib-sieve/plugins/environment/ext-environment-common.c b/src/lib-sieve/plugins/environment/ext-environment-common.c
index eed230f30..979716905 100644
--- a/src/lib-sieve/plugins/environment/ext-environment-common.c
+++ b/src/lib-sieve/plugins/environment/ext-environment-common.c
@@ -100,7 +100,7 @@ const struct sieve_environment_item domain_env_item = {
 
 const char *envit_host_get_value(const struct sieve_script_env *senv)
 {
-	return senv->hostname;
+	return senv->hostname != NULL ? senv->hostname : "";
 }
 
 const struct sieve_environment_item host_env_item = {
diff --git a/src/lib-sieve/plugins/environment/tst-environment.c b/src/lib-sieve/plugins/environment/tst-environment.c
index 205026251..0ae60630c 100644
--- a/src/lib-sieve/plugins/environment/tst-environment.c
+++ b/src/lib-sieve/plugins/environment/tst-environment.c
@@ -200,18 +200,21 @@ static int tst_environment_operation_execute
 
 	env_item = ext_environment_item_get_value(str_c(name), renv->scriptenv);
 
-	mctx = sieve_match_begin(renv->interp, mtch, cmp, NULL, key_list); 	
-
-	if ( (mret=sieve_match_value(mctx, env_item, strlen(env_item))) < 0 ) {
-		result = FALSE;
-	} else {
-		matched = ( mret > 0 );				
+	if ( env_item != NULL ) {
+		mctx = sieve_match_begin(renv->interp, mtch, cmp, NULL, key_list); 	
+
+		if ( (mret=sieve_match_value(mctx, strlen(env_item) == 0 ? NULL : env_item, 
+			strlen(env_item))) < 0 ) {
+			result = FALSE;
+		} else {
+			matched = ( mret > 0 );				
+		}
+
+		if ( (mret=sieve_match_end(mctx)) < 0 )
+			result = FALSE;
+		else
+			matched = ( mret > 0 || matched );
 	}
-
-	if ( (mret=sieve_match_end(mctx)) < 0 )
-		result = FALSE;
-	else
-		matched = ( mret > 0 || matched ); 	
 	
 	if ( result ) {
 		sieve_interpreter_set_test_result(renv->interp, matched);
-- 
GitLab