diff --git a/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c b/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c
index a82e81dfbf6226a583b6c6a575739dac4d077c41..fe5477c397a8eea47f9f74dc5e24acf2b9247d5a 100644
--- a/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c
+++ b/src/lib-sieve/plugins/enotify/vmodf-encodeurl.c
@@ -67,6 +67,11 @@ bool mod_encodeurl_modify(string_t *in, string_t **result)
 	unsigned int i;
 	const unsigned char *c;
 
+	if ( str_len(in) == 0 ) {
+		*result = in;
+		return TRUE;
+	}
+
 	*result = t_str_new(2*str_len(in));
 	c = str_data(in);
 
diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index ca30b56e374647f354453c11a22ee3f6fddca592..43997fa36535557ac3c7efb6c9b34d501c07ac12 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -326,26 +326,24 @@ static int cmd_set_operation_execute
 			break;
 		}
 
-		if ( str_len(value) > 0 ) {
-			if ( modf.def != NULL && modf.def->modify != NULL ) {
-				if ( !modf.def->modify(value, &new_value) ) {
-					value = NULL;
-					ret = SIEVE_EXEC_FAILURE;
-					break;
-				}
-
-				sieve_runtime_trace_here
-					(renv, SIEVE_TRLVL_COMMANDS, "modify :%s \"%s\" => \"%s\"",
-						sieve_variables_modifier_name(&modf), str_c(value), str_c(new_value));
-
-				value = new_value;
-				if ( value == NULL )
-					break;
-
-				/* Hold value within limits */
-				if ( str_len(value) > EXT_VARIABLES_MAX_VARIABLE_SIZE )
-					str_truncate(value, EXT_VARIABLES_MAX_VARIABLE_SIZE);
+		if ( modf.def != NULL && modf.def->modify != NULL ) {
+			if ( !modf.def->modify(value, &new_value) ) {
+				value = NULL;
+				ret = SIEVE_EXEC_FAILURE;
+				break;
 			}
+
+			sieve_runtime_trace_here
+				(renv, SIEVE_TRLVL_COMMANDS, "modify :%s \"%s\" => \"%s\"",
+					sieve_variables_modifier_name(&modf), str_c(value), str_c(new_value));
+
+			value = new_value;
+			if ( value == NULL )
+				break;
+
+			/* Hold value within limits */
+			if ( str_len(value) > EXT_VARIABLES_MAX_VARIABLE_SIZE )
+				str_truncate(value, EXT_VARIABLES_MAX_VARIABLE_SIZE);
 		}
 	}
 
diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
index e6e9d9408bbe6e92e851da737131295eac9334ef..5c1790a90feb08f297e223d73c17cb1b9ecaf2a1 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
@@ -190,6 +190,11 @@ bool mod_upperfirst_modify(string_t *in, string_t **result)
 {
 	char *content;
 
+	if ( str_len(in) == 0 ) {
+		*result = in;
+		return TRUE;
+	}
+
 	*result = t_str_new(str_len(in));
 	str_append_str(*result, in);
 
@@ -203,6 +208,11 @@ bool mod_lowerfirst_modify(string_t *in, string_t **result)
 {
 	char *content;
 
+	if ( str_len(in) == 0 ) {
+		*result = in;
+		return TRUE;
+	}
+
 	*result = t_str_new(str_len(in));
 	str_append_str(*result, in);
 
@@ -216,6 +226,11 @@ bool mod_upper_modify(string_t *in, string_t **result)
 {
 	char *content;
 
+	if ( str_len(in) == 0 ) {
+		*result = in;
+		return TRUE;
+	}
+
 	*result = t_str_new(str_len(in));
 	str_append_str(*result, in);
 
@@ -229,6 +244,11 @@ bool mod_lower_modify(string_t *in, string_t **result)
 {
 	char *content;
 
+	if ( str_len(in) == 0 ) {
+		*result = in;
+		return TRUE;
+	}
+
 	*result = t_str_new(str_len(in));
 	str_append_str(*result, in);
 
@@ -251,6 +271,11 @@ bool mod_quotewildcard_modify(string_t *in, string_t **result)
 	unsigned int i;
 	const char *content;
 
+	if ( str_len(in) == 0 ) {
+		*result = in;
+		return TRUE;
+	}
+
 	*result = t_str_new(str_len(in) * 2);
 	content = (const char *) str_data(in);
 
diff --git a/tests/extensions/variables/modifiers.svtest b/tests/extensions/variables/modifiers.svtest
index 60b174fa5955f42f5b748ee0474f1b46f79233e0..37068b63db38c516a499226108e99b5489fc4f6e 100644
--- a/tests/extensions/variables/modifiers.svtest
+++ b/tests/extensions/variables/modifiers.svtest
@@ -70,7 +70,15 @@ test "Modifiers :lowerfirst :upper" {
 	}
 }
 
-test "Modifier :length" {
+test "Modifier :length (empty)" {
+	set :length "test" "";
+
+	if not string :is "${test}" "0" {
+		test_fail "modified variable assignment failed";
+	}
+}
+
+test "Modifier :length (simple)" {
 	set :length "test" "VaLuE";
 
 	if not string :is "${test}" "5" {