diff --git a/src/lib-sieve/sieve-error-private.h b/src/lib-sieve/sieve-error-private.h
index a0fd36c4e2c031e741e11a48490bcb11b16545c5..b9caee5f2e4ccb28952c22cde939d3123d4dfb70 100644
--- a/src/lib-sieve/sieve-error-private.h
+++ b/src/lib-sieve/sieve-error-private.h
@@ -43,17 +43,21 @@ struct sieve_error_handler {
 	bool log_debug;
 
 	void (*verror)(struct sieve_error_handler *ehandler,
-		       unsigned int flags, const char *location,
-		       const char *fmt, va_list args) ATTR_FORMAT(4, 0);
+		       const struct sieve_error_params *params,
+		       unsigned int flags, const char *fmt, va_list args)
+		       ATTR_FORMAT(4, 0);
 	void (*vwarning)(struct sieve_error_handler *ehandler,
-			 unsigned int flags, const char *location,
-			 const char *fmt, va_list args) ATTR_FORMAT(4, 0);;
+			 const struct sieve_error_params *params,
+			 unsigned int flags, const char *fmt, va_list args)
+			 ATTR_FORMAT(4, 0);
 	void (*vinfo)(struct sieve_error_handler *ehandler,
-		      unsigned int flags, const char *location,
-		      const char *fmt, va_list args) ATTR_FORMAT(4, 0);;
+		      const struct sieve_error_params *params,
+		      unsigned int flags, const char *fmt, va_list args)
+		      ATTR_FORMAT(4, 0);
 	void (*vdebug)(struct sieve_error_handler *ehandler,
-		       unsigned int flags, const char *location,
-		       const char *fmt, va_list args) ATTR_FORMAT(4, 0);;
+		       const struct sieve_error_params *params,
+		       unsigned int flags, const char *fmt, va_list args)
+		       ATTR_FORMAT(4, 0);
 
 	void (*free)(struct sieve_error_handler *ehandler);
 };
@@ -72,70 +76,74 @@ void sieve_error_handler_init_from_parent(struct sieve_error_handler *ehandler,
 
 void sieve_direct_verror(struct sieve_instance *svinst,
 			 struct sieve_error_handler *ehandler,
-			 unsigned int flags, const char *location,
-			 const char *fmt, va_list args) ATTR_FORMAT(5, 0);
+			 const struct sieve_error_params *params,
+			 unsigned int flags, const char *fmt, va_list args)
+			 ATTR_FORMAT(5, 0);
 void sieve_direct_vwarning(struct sieve_instance *svinst,
 			   struct sieve_error_handler *ehandler,
-			   unsigned int flags, const char *location,
-			   const char *fmt, va_list args) ATTR_FORMAT(5, 0);
+			   const struct sieve_error_params *params,
+			   unsigned int flags, const char *fmt, va_list args)
+			   ATTR_FORMAT(5, 0);
 void sieve_direct_vinfo(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
-			unsigned int flags, const char *location,
-			const char *fmt, va_list args) ATTR_FORMAT(5, 0);
+			const struct sieve_error_params *params,
+			unsigned int flags, const char *fmt, va_list args)
+			ATTR_FORMAT(5, 0);
 void sieve_direct_vdebug(struct sieve_instance *svinst,
 			 struct sieve_error_handler *ehandler,
-			 unsigned int flags, const char *location,
-			 const char *fmt, va_list args) ATTR_FORMAT(5, 0);
+			 const struct sieve_error_params *params,
+			 unsigned int flags, const char *fmt, va_list args)
+			 ATTR_FORMAT(5, 0);
 
 static inline void ATTR_FORMAT(5, 6)
 sieve_direct_error(struct sieve_instance *svinst,
 		   struct sieve_error_handler *ehandler,
-		   unsigned int flags, const char *location,
-		   const char *fmt, ...)
+		   const struct sieve_error_params *params,
+		   unsigned int flags, const char *fmt, ...)
 {
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_direct_verror(svinst, ehandler, flags, location, fmt, args);
+	sieve_direct_verror(svinst, ehandler, params, flags, fmt, args);
 	va_end(args);
 }
 
 static inline void ATTR_FORMAT(5, 6)
 sieve_direct_warning(struct sieve_instance *svinst,
 		     struct sieve_error_handler *ehandler,
-		     unsigned int flags, const char *location,
-		     const char *fmt, ...)
+		     const struct sieve_error_params *params,
+		     unsigned int flags, const char *fmt, ...)
 {
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_direct_vwarning(svinst, ehandler, flags, location, fmt, args);
+	sieve_direct_vwarning(svinst, ehandler, params, flags, fmt, args);
 	va_end(args);
 }
 
 static inline void ATTR_FORMAT(5, 6)
 sieve_direct_info(struct sieve_instance *svinst,
 		  struct sieve_error_handler *ehandler,
-		  unsigned int flags, const char *location,
-		  const char *fmt, ...)
+		  const struct sieve_error_params *params,
+		  unsigned int flags, const char *fmt, ...)
 {
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_direct_vinfo(svinst, ehandler, flags, location, fmt, args);
+	sieve_direct_vinfo(svinst, ehandler, params, flags, fmt, args);
 	va_end(args);
 }
 
 static inline void ATTR_FORMAT(5, 6)
 sieve_direct_debug(struct sieve_instance *svinst,
 		   struct sieve_error_handler *ehandler,
-		   unsigned int flags, const char *location,
-		   const char *fmt, ...)
+		   const struct sieve_error_params *params,
+		   unsigned int flags, const char *fmt, ...)
 {
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_direct_vdebug(svinst, ehandler, flags, location, fmt, args);
+	sieve_direct_vdebug(svinst, ehandler, params, flags, fmt, args);
 	va_end(args);
 }
 
diff --git a/src/lib-sieve/sieve-error.c b/src/lib-sieve/sieve-error.c
index e25c813520f94bce1f94f9d14fd58557c2a22f5c..5bb67a4b80ad293ee5333ffb5edc8e0529c70be6 100644
--- a/src/lib-sieve/sieve-error.c
+++ b/src/lib-sieve/sieve-error.c
@@ -74,7 +74,8 @@ void sieve_errors_deinit(struct sieve_instance *svinst)
 
 void sieve_direct_verror(struct sieve_instance *svinst,
 			 struct sieve_error_handler *ehandler,
-			 unsigned int flags, const char *location,
+			 const struct sieve_error_params *params,
+			 unsigned int flags,
 			 const char *fmt, va_list args)
 {
 	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
@@ -88,14 +89,14 @@ void sieve_direct_verror(struct sieve_instance *svinst,
 			if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
 				if (svinst->system_ehandler->vinfo != NULL) {
 					svinst->system_ehandler->vinfo(
-						svinst->system_ehandler, 0,
-						location, fmt, args_copy);
+						svinst->system_ehandler,
+						params, 0, fmt, args_copy);
 				}
 			} else {
 				if (svinst->system_ehandler->verror != NULL) {
 					svinst->system_ehandler->verror(
-						svinst->system_ehandler, 0,
-						location, fmt, args_copy);
+						svinst->system_ehandler,
+						params, 0, fmt, args_copy);
 				}
 			}
 			va_end(args_copy);
@@ -110,7 +111,7 @@ void sieve_direct_verror(struct sieve_instance *svinst,
 
 	if (ehandler->parent != NULL || sieve_errors_more_allowed(ehandler)) {
 		if (ehandler->verror != NULL)
-			ehandler->verror(ehandler, flags, location, fmt, args);
+			ehandler->verror(ehandler, params, flags, fmt, args);
 
 		if (ehandler->pool != NULL)
 			ehandler->errors++;
@@ -119,8 +120,8 @@ void sieve_direct_verror(struct sieve_instance *svinst,
 
 void sieve_direct_vwarning(struct sieve_instance *svinst,
 			   struct sieve_error_handler *ehandler,
-			   unsigned int flags, const char *location,
-			   const char *fmt, va_list args)
+			   const struct sieve_error_params *params,
+			   unsigned int flags, const char *fmt, va_list args)
 {
 	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
 	    (ehandler == NULL || ehandler->parent == NULL)) {
@@ -133,14 +134,14 @@ void sieve_direct_vwarning(struct sieve_instance *svinst,
 			if ((flags & SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO) != 0) {
 				if (svinst->system_ehandler->vinfo != NULL) {
 					svinst->system_ehandler->vinfo(
-						svinst->system_ehandler, 0,
-						location, fmt, args_copy);
+						svinst->system_ehandler,
+						params, 0, fmt, args_copy);
 				}
 			} else {
 				if (svinst->system_ehandler->vwarning != NULL) {
 					svinst->system_ehandler->vwarning(
-						svinst->system_ehandler, 0,
-						location, fmt, args_copy);
+						svinst->system_ehandler,
+						params, 0, fmt, args_copy);
 				}
 			}
 			va_end(args_copy);
@@ -154,7 +155,7 @@ void sieve_direct_vwarning(struct sieve_instance *svinst,
 		return;
 
 	if (ehandler->vwarning != NULL)
-		ehandler->vwarning(ehandler, flags, location, fmt, args);
+		ehandler->vwarning(ehandler, params, flags, fmt, args);
 
 	if (ehandler->pool != NULL)
 		ehandler->warnings++;
@@ -162,8 +163,8 @@ void sieve_direct_vwarning(struct sieve_instance *svinst,
 
 void sieve_direct_vinfo(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
-			unsigned int flags, const char *location,
-			const char *fmt, va_list args)
+			const struct sieve_error_params *params,
+			unsigned int flags, const char *fmt, va_list args)
 {
 	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
 	    (ehandler == NULL || ehandler->parent == NULL) &&
@@ -174,7 +175,7 @@ void sieve_direct_vinfo(struct sieve_instance *svinst,
 
 			VA_COPY(args_copy, args);
 			svinst->system_ehandler->vinfo(
-				svinst->system_ehandler, 0, location,
+				svinst->system_ehandler, params, 0,
 				fmt, args_copy);
 			va_end(args_copy);
 		}
@@ -185,14 +186,14 @@ void sieve_direct_vinfo(struct sieve_instance *svinst,
 
 	if (ehandler->parent != NULL || ehandler->log_info) {
 		if (ehandler->vinfo != NULL)
-			ehandler->vinfo(ehandler, flags, location, fmt, args);
+			ehandler->vinfo(ehandler, params, flags, fmt, args);
 	}
 }
 
 void sieve_direct_vdebug(struct sieve_instance *svinst,
 			 struct sieve_error_handler *ehandler,
-			 unsigned int flags, const char *location,
-			 const char *fmt, va_list args)
+			 const struct sieve_error_params *params,
+			 unsigned int flags, const char *fmt, va_list args)
 {
 	if ((flags & SIEVE_ERROR_FLAG_GLOBAL) != 0 &&
 	    (ehandler == NULL || ehandler->parent == NULL) &&
@@ -203,7 +204,7 @@ void sieve_direct_vdebug(struct sieve_instance *svinst,
 
 			VA_COPY(args_copy, args);
 			svinst->system_ehandler->vdebug(
-				svinst->system_ehandler, 0, location,
+				svinst->system_ehandler, params, 0,
 				fmt, args_copy);
 			va_end(args_copy);
 		}
@@ -214,7 +215,7 @@ void sieve_direct_vdebug(struct sieve_instance *svinst,
 
 	if (ehandler->parent != NULL || ehandler->log_debug) {
 		if (ehandler->vdebug != NULL)
-			ehandler->vdebug(ehandler, flags, location, fmt, args);
+			ehandler->vdebug(ehandler, params, flags, fmt, args);
 	}
 }
 
@@ -243,59 +244,63 @@ sieve_system_ehandler_get(struct sieve_instance *svinst)
 
 void sieve_global_verror(struct sieve_instance *svinst,
 			 struct sieve_error_handler *ehandler,
-			 const char *location, const char *fmt, va_list args)
+			 const struct sieve_error_params *params,
+			 const char *fmt, va_list args)
 {
-	sieve_direct_verror(svinst, ehandler, SIEVE_ERROR_FLAG_GLOBAL,
-			    location, fmt, args);
+	sieve_direct_verror(svinst, ehandler, params,
+			    SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
 }
 
 void sieve_global_vwarning(struct sieve_instance *svinst,
 			   struct sieve_error_handler *ehandler,
-			   const char *location, const char *fmt, va_list args)
+			   const struct sieve_error_params *params,
+			   const char *fmt, va_list args)
 {
-	sieve_direct_vwarning(svinst, ehandler, SIEVE_ERROR_FLAG_GLOBAL,
-			      location, fmt, args);
+	sieve_direct_vwarning(svinst, ehandler, params,
+			      SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
 }
 
 void sieve_global_vinfo(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
-			const char *location, const char *fmt, va_list args)
+			const struct sieve_error_params *params,
+			const char *fmt, va_list args)
 {
-	sieve_direct_vinfo(svinst, ehandler, SIEVE_ERROR_FLAG_GLOBAL,
-			   location, fmt, args);
+	sieve_direct_vinfo(svinst, ehandler, params,
+			   SIEVE_ERROR_FLAG_GLOBAL, fmt, args);
 }
 
 void sieve_global_info_verror(struct sieve_instance *svinst,
 			      struct sieve_error_handler *ehandler,
-			      const char *location,
+			      const struct sieve_error_params *params,
 			      const char *fmt, va_list args)
 {
-	sieve_direct_verror(svinst, ehandler,
+	sieve_direct_verror(svinst, ehandler, params,
 			    (SIEVE_ERROR_FLAG_GLOBAL |
-			     SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO),
-			    location, fmt, args);
+			     SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args);
 }
 
 void sieve_global_info_vwarning(struct sieve_instance *svinst,
 				struct sieve_error_handler *ehandler,
-				const char *location,
+				const struct sieve_error_params *params,
 				const char *fmt, va_list args)
 {
-	sieve_direct_vwarning(svinst, ehandler,
+	sieve_direct_vwarning(svinst, ehandler, params,
 			      (SIEVE_ERROR_FLAG_GLOBAL |
-			       SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO),
-			      location, fmt, args);
+			       SIEVE_ERROR_FLAG_GLOBAL_MAX_INFO), fmt, args);
 }
 
 void sieve_global_error(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
 			const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_verror(svinst, ehandler, location, fmt, args);
+		sieve_global_verror(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -305,11 +310,14 @@ void sieve_global_warning(struct sieve_instance *svinst,
 			  struct sieve_error_handler *ehandler,
 			  const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_vwarning(svinst, ehandler, location, fmt, args);
+		sieve_global_vwarning(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -319,11 +327,14 @@ void sieve_global_info(struct sieve_instance *svinst,
 		       struct sieve_error_handler *ehandler,
 		       const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_vinfo(svinst, ehandler, location, fmt, args);
+		sieve_global_vinfo(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -333,11 +344,14 @@ void sieve_global_info_error(struct sieve_instance *svinst,
 			     struct sieve_error_handler *ehandler,
 			     const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_info_verror(svinst, ehandler, location, fmt, args);
+		sieve_global_info_verror(svinst, ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -347,11 +361,14 @@ void sieve_global_info_warning(struct sieve_instance *svinst,
 			       struct sieve_error_handler *ehandler,
 			       const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_global_info_vwarning(svinst, ehandler, location,
+		sieve_global_info_vwarning(svinst, ehandler, &params,
 					   fmt, args);
 	} T_END;
 
@@ -365,6 +382,9 @@ void sieve_global_info_warning(struct sieve_instance *svinst,
 void sieve_internal_error(struct sieve_error_handler *ehandler,
 			  const char *location, const char *user_prefix)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	char str[256];
 	const char *msg;
 	struct tm *tm;
@@ -377,69 +397,71 @@ void sieve_internal_error(struct sieve_error_handler *ehandler,
 	       str : CRITICAL_MSG);
 
 	if (user_prefix == NULL || *user_prefix == '\0') {
-		sieve_direct_error(ehandler->svinst, ehandler, 0, location,
+		sieve_direct_error(ehandler->svinst, ehandler, &params, 0,
 				   "%s", msg);
 	} else {
-		sieve_direct_error(ehandler->svinst, ehandler, 0, location,
+		sieve_direct_error(ehandler->svinst, ehandler, &params, 0,
 				   "%s: %s", user_prefix, msg);
 	}
 }
 
-void sieve_verror(struct sieve_error_handler *ehandler, const char *location,
+void sieve_verror(struct sieve_error_handler *ehandler,
+		  const struct sieve_error_params *params,
 		  const char *fmt, va_list args)
 {
 	if (ehandler == NULL) return;
 
-	sieve_direct_verror(ehandler->svinst, ehandler, 0, location, fmt, args);
+	sieve_direct_verror(ehandler->svinst, ehandler, params, 0, fmt, args);
 }
 
-void sieve_vwarning(struct sieve_error_handler *ehandler, const char *location,
+void sieve_vwarning(struct sieve_error_handler *ehandler,
+		    const struct sieve_error_params *params,
 		    const char *fmt, va_list args)
 {
 	if (ehandler == NULL) return;
 
-	sieve_direct_vwarning(ehandler->svinst, ehandler, 0, location, fmt, args);
+	sieve_direct_vwarning(ehandler->svinst, ehandler, params, 0, fmt, args);
 }
 
-void sieve_vinfo(struct sieve_error_handler *ehandler, const char *location,
+void sieve_vinfo(struct sieve_error_handler *ehandler,
+		 const struct sieve_error_params *params,
 		 const char *fmt, va_list args)
 {
 	if (ehandler == NULL) return;
 
-	sieve_direct_vinfo(ehandler->svinst, ehandler, 0, location, fmt, args);
+	sieve_direct_vinfo(ehandler->svinst, ehandler, params, 0, fmt, args);
 }
 
-void sieve_vdebug(struct sieve_error_handler *ehandler, const char *location,
+void sieve_vdebug(struct sieve_error_handler *ehandler,
+		  const struct sieve_error_params *params,
 		  const char *fmt, va_list args)
 {
 	if (ehandler == NULL) return;
 
-	sieve_direct_vdebug(ehandler->svinst, ehandler, 0, location, fmt, args);
+	sieve_direct_vdebug(ehandler->svinst, ehandler, params, 0, fmt, args);
 }
 
 void sieve_vcritical(struct sieve_instance *svinst,
-		     struct sieve_error_handler *ehandler, const char *location,
+		     struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
 		     const char *user_prefix, const char *fmt, va_list args)
 {
-	if (location == NULL || *location == '\0') {
-		sieve_direct_verror(svinst, svinst->system_ehandler,
-				    0, NULL, fmt, args);
-	} else {
-		sieve_direct_verror(svinst, svinst->system_ehandler,
-				    0, location, fmt, args);
-	}
-
-	sieve_internal_error(ehandler, location, user_prefix);
+	sieve_direct_verror(svinst, svinst->system_ehandler, params, 0,
+			    fmt, args);
+	sieve_internal_error(ehandler, params->location, user_prefix);
 }
 
 void sieve_error(struct sieve_error_handler *ehandler, const char *location,
 		 const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_verror(ehandler, location, fmt, args);
+		sieve_verror(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -448,11 +470,14 @@ void sieve_error(struct sieve_error_handler *ehandler, const char *location,
 void sieve_warning(struct sieve_error_handler *ehandler, const char *location,
 		   const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vwarning(ehandler, location, fmt, args);
+		sieve_vwarning(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -461,11 +486,14 @@ void sieve_warning(struct sieve_error_handler *ehandler, const char *location,
 void sieve_info(struct sieve_error_handler *ehandler, const char *location,
 		const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vinfo(ehandler, location, fmt, args);
+		sieve_vinfo(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -474,11 +502,14 @@ void sieve_info(struct sieve_error_handler *ehandler, const char *location,
 void sieve_debug(struct sieve_error_handler *ehandler, const char *location,
 		 const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vdebug(ehandler, location, fmt, args);
+		sieve_vdebug(ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -488,11 +519,14 @@ void sieve_critical(struct sieve_instance *svinst,
 		    struct sieve_error_handler *ehandler, const char *location,
 		    const char *user_prefix, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vcritical(svinst, ehandler, location, user_prefix,
+		sieve_vcritical(svinst, ehandler, &params, user_prefix,
 				fmt, args);
 	} T_END;
 
@@ -635,7 +669,8 @@ typedef void (*master_log_func_t)(const char *fmt, ...) ATTR_FORMAT(1, 2);
 
 static void ATTR_FORMAT(4, 0)
 sieve_master_vlog(struct sieve_error_handler *_ehandler,
-		  master_log_func_t log_func, const char *location,
+		  const struct sieve_error_params *params,
+		  master_log_func_t log_func,
 		  const char *fmt, va_list args)
 {
 	struct sieve_master_ehandler *ehandler =
@@ -648,8 +683,8 @@ sieve_master_vlog(struct sieve_error_handler *_ehandler,
 
 	str_append(str, "sieve: ");
 
-	if (location != NULL && *location != '\0')
-		str_printfa(str, "%s: ", location);
+	if (params->location != NULL && *params->location != '\0')
+		str_printfa(str, "%s: ", params->location);
 
 	str_vprintfa(str, fmt, args);
 
@@ -658,34 +693,38 @@ sieve_master_vlog(struct sieve_error_handler *_ehandler,
 
 static void ATTR_FORMAT(4, 0)
 sieve_master_verror(struct sieve_error_handler *ehandler,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
-	sieve_master_vlog(ehandler, i_error, location, fmt, args);
+	sieve_master_vlog(ehandler, params, i_error, fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_master_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      unsigned int flags ATTR_UNUSED, const char *location,
+		      const struct sieve_error_params *params,
+		      unsigned int flags ATTR_UNUSED,
 		      const char *fmt, va_list args)
 {
-	sieve_master_vlog(ehandler, i_warning, location, fmt, args);
+	sieve_master_vlog(ehandler, params, i_warning, fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_master_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		   unsigned int flags ATTR_UNUSED, const char *location,
+		   const struct sieve_error_params *params,
+		   unsigned int flags ATTR_UNUSED,
 		   const char *fmt, va_list args)
 {
-	sieve_master_vlog(ehandler, i_info, location, fmt, args);
+	sieve_master_vlog(ehandler, params, i_info, fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_master_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
-	sieve_master_vlog(ehandler, i_debug, location, fmt, args);
+	sieve_master_vlog(ehandler, params, i_debug, fmt, args);
 }
 
 struct sieve_error_handler *
@@ -720,48 +759,52 @@ sieve_master_ehandler_create(struct sieve_instance *svinst, const char *prefix,
 
 static void ATTR_FORMAT(4, 0)
 sieve_stderr_vmessage(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      const char *prefix, const char *location,
-		      const char *fmt, va_list args)
+		      const struct sieve_error_params *params,
+		      const char *prefix, const char *fmt, va_list args)
 {
-	if (location == NULL || *location == '\0') {
+	if (params->location == NULL || *params->location == '\0') {
 		fprintf(stderr, "%s: %s.\n", prefix,
 			t_strdup_vprintf(fmt, args));
 	} else {
-		fprintf(stderr, "%s: %s: %s.\n", location, prefix,
+		fprintf(stderr, "%s: %s: %s.\n", params->location, prefix,
 			t_strdup_vprintf(fmt, args));
 	}
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_stderr_verror(struct sieve_error_handler *ehandler,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
-	sieve_stderr_vmessage(ehandler, "error", location, fmt, args);
+	sieve_stderr_vmessage(ehandler, params, "error", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_stderr_vwarning(struct sieve_error_handler *ehandler,
-		      unsigned int flags ATTR_UNUSED, const char *location,
+		      const struct sieve_error_params *params,
+		      unsigned int flags ATTR_UNUSED,
 		      const char *fmt, va_list args)
 {
-	sieve_stderr_vmessage(ehandler, "warning", location, fmt, args);
+	sieve_stderr_vmessage(ehandler, params, "warning", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_stderr_vinfo(struct sieve_error_handler *ehandler,
-		   unsigned int flags ATTR_UNUSED, const char *location,
+		   const struct sieve_error_params *params,
+		   unsigned int flags ATTR_UNUSED,
 		   const char *fmt, va_list args)
 {
-	sieve_stderr_vmessage(ehandler, "info", location, fmt, args);
+	sieve_stderr_vmessage(ehandler, params, "info", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_stderr_vdebug(struct sieve_error_handler *ehandler,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
-	sieve_stderr_vmessage(ehandler, "debug", location, fmt, args);
+	sieve_stderr_vmessage(ehandler, params, "debug", fmt, args);
 }
 
 struct sieve_error_handler *
@@ -800,14 +843,15 @@ struct sieve_strbuf_ehandler {
 };
 
 static void ATTR_FORMAT(4, 0)
-sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, const char *prefix,
-		      const char *location, const char *fmt, va_list args)
+sieve_strbuf_vmessage(struct sieve_error_handler *ehandler,
+		      const struct sieve_error_params *params,
+		      const char *prefix, const char *fmt, va_list args)
 {
 	struct sieve_strbuf_ehandler *handler =
 		(struct sieve_strbuf_ehandler *) ehandler;
 
-	if (location != NULL && *location != '\0')
-		str_printfa(handler->errors, "%s: ", location);
+	if (params->location != NULL && *params->location != '\0')
+		str_printfa(handler->errors, "%s: ", params->location);
 	str_printfa(handler->errors, "%s: ", prefix);
 	str_vprintfa(handler->errors, fmt, args);
 
@@ -819,34 +863,38 @@ sieve_strbuf_vmessage(struct sieve_error_handler *ehandler, const char *prefix,
 
 static void ATTR_FORMAT(4, 0)
 sieve_strbuf_verror(struct sieve_error_handler *ehandler,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
-	sieve_strbuf_vmessage(ehandler, "error", location, fmt, args);
+	sieve_strbuf_vmessage(ehandler, params, "error", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_strbuf_vwarning(struct sieve_error_handler *ehandler,
-		      unsigned int flags ATTR_UNUSED, const char *location,
+		      const struct sieve_error_params *params,
+		      unsigned int flags ATTR_UNUSED,
 		      const char *fmt, va_list args)
 {
-	sieve_strbuf_vmessage(ehandler, "warning", location, fmt, args);
+	sieve_strbuf_vmessage(ehandler, params, "warning", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_strbuf_vinfo(struct sieve_error_handler *ehandler,
-		   unsigned int flags ATTR_UNUSED, const char *location,
+		   const struct sieve_error_params *params,
+		   unsigned int flags ATTR_UNUSED,
 		   const char *fmt, va_list args)
 {
-	sieve_strbuf_vmessage(ehandler, "info", location, fmt, args);
+	sieve_strbuf_vmessage(ehandler, params, "info", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_strbuf_vdebug(struct sieve_error_handler *ehandler,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
-	sieve_strbuf_vmessage(ehandler, "debug", location, fmt, args);
+	sieve_strbuf_vmessage(ehandler, params, "debug", fmt, args);
 }
 
 struct sieve_error_handler *
@@ -889,8 +937,8 @@ struct sieve_logfile_ehandler {
 
 static void ATTR_FORMAT(4, 0)
 sieve_logfile_vprintf(struct sieve_logfile_ehandler *ehandler,
-		      const char *location, const char *prefix,
-		      const char *fmt, va_list args)
+		      const struct sieve_error_params *params,
+		      const char *prefix, const char *fmt, va_list args)
 {
 	string_t *outbuf;
 	ssize_t ret = 0, remain;
@@ -901,8 +949,8 @@ sieve_logfile_vprintf(struct sieve_logfile_ehandler *ehandler,
 
 	T_BEGIN {
 		outbuf = t_str_new(256);
-		if (location != NULL && *location != '\0')
-			str_printfa(outbuf, "%s: ", location);
+		if (params->location != NULL && *params->location != '\0')
+			str_printfa(outbuf, "%s: ", params->location);
 		str_printfa(outbuf, "%s: ", prefix);
 		str_vprintfa(outbuf, fmt, args);
 		str_append(outbuf, ".\n");
@@ -932,10 +980,13 @@ sieve_logfile_printf(struct sieve_logfile_ehandler *ehandler,
 		     const char *location, const char *prefix,
 		     const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 	va_start(args, fmt);
 
-	sieve_logfile_vprintf(ehandler, location, prefix, fmt, args);
+	sieve_logfile_vprintf(ehandler, &params, prefix, fmt, args);
 
 	va_end(args);
 }
@@ -1066,7 +1117,8 @@ static void sieve_logfile_start(struct sieve_logfile_ehandler *ehandler)
 
 static void ATTR_FORMAT(4, 0)
 sieve_logfile_verror(struct sieve_error_handler *ehandler,
-		     unsigned int flags ATTR_UNUSED, const char *location,
+		     const struct sieve_error_params *params,
+		     unsigned int flags ATTR_UNUSED,
 		     const char *fmt, va_list args)
 {
 	struct sieve_logfile_ehandler *handler =
@@ -1075,12 +1127,13 @@ sieve_logfile_verror(struct sieve_error_handler *ehandler,
 	if (!handler->started)
 		sieve_logfile_start(handler);
 
-	sieve_logfile_vprintf(handler, location, "error", fmt, args);
+	sieve_logfile_vprintf(handler, params, "error", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_logfile_vwarning(struct sieve_error_handler *ehandler,
-		       unsigned int flags ATTR_UNUSED, const char *location,
+		       const struct sieve_error_params *params,
+		       unsigned int flags ATTR_UNUSED,
 		       const char *fmt, va_list args)
 {
 	struct sieve_logfile_ehandler *handler =
@@ -1089,12 +1142,13 @@ sieve_logfile_vwarning(struct sieve_error_handler *ehandler,
 	if (!handler->started)
 		sieve_logfile_start(handler);
 
-	sieve_logfile_vprintf(handler, location, "warning", fmt, args);
+	sieve_logfile_vprintf(handler, params, "warning", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_logfile_vinfo(struct sieve_error_handler *ehandler,
-		    unsigned int flags ATTR_UNUSED, const char *location,
+		    const struct sieve_error_params *params,
+		    unsigned int flags ATTR_UNUSED,
 		    const char *fmt, va_list args)
 {
 	struct sieve_logfile_ehandler *handler =
@@ -1103,12 +1157,13 @@ sieve_logfile_vinfo(struct sieve_error_handler *ehandler,
 	if (!handler->started)
 		sieve_logfile_start(handler);
 
-	sieve_logfile_vprintf(handler, location, "info", fmt, args);
+	sieve_logfile_vprintf(handler, params, "info", fmt, args);
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_logfile_vdebug(struct sieve_error_handler *ehandler,
-		     unsigned int flags ATTR_UNUSED, const char *location,
+		     const struct sieve_error_params *params,
+		     unsigned int flags ATTR_UNUSED,
 		     const char *fmt, va_list args)
 {
 	struct sieve_logfile_ehandler *handler =
@@ -1117,7 +1172,7 @@ sieve_logfile_vdebug(struct sieve_error_handler *ehandler,
 	if (!handler->started)
 		sieve_logfile_start(handler);
 
-	sieve_logfile_vprintf(handler, location, "debug", fmt, args);
+	sieve_logfile_vprintf(handler, params, "debug", fmt, args);
 }
 
 static void sieve_logfile_free(struct sieve_error_handler *ehandler)
@@ -1183,66 +1238,83 @@ struct sieve_prefix_ehandler {
 };
 
 static const char *ATTR_FORMAT(3, 0)
-_prefix_message(struct sieve_prefix_ehandler *ehandler, const char *location,
+_prefix_message(struct sieve_prefix_ehandler *ehandler,
+		const struct sieve_error_params *params,
 		const char *fmt, va_list args)
 {
 	string_t *str = t_str_new(256);
 
 	if (ehandler->prefix != NULL)
 		str_printfa(str, "%s: ", ehandler->prefix);
-	if (location != NULL)
-		str_printfa(str, "%s: ", location);
+	if (params->location != NULL && *params->location != '\0')
+		str_printfa(str, "%s: ", params->location);
 	str_vprintfa(str, fmt, args);
 
 	return str_c(str);
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_prefix_verror(struct sieve_error_handler *_ehandler, unsigned int flags,
-		    const char *location, const char *fmt, va_list args)
+sieve_prefix_verror(struct sieve_error_handler *_ehandler,
+		    const struct sieve_error_params *params,
+		    unsigned int flags, const char *fmt, va_list args)
 {
 	struct sieve_prefix_ehandler *ehandler =
 		(struct sieve_prefix_ehandler *) _ehandler;
+	struct sieve_error_params new_params = *params;
+
+	new_params.location = ehandler->location;
 
-	sieve_direct_error(_ehandler->svinst, _ehandler->parent, flags,
-			   ehandler->location, "%s",
-			   _prefix_message(ehandler, location, fmt, args));
+	sieve_direct_error(_ehandler->svinst, _ehandler->parent,
+			   &new_params, flags, "%s",
+			   _prefix_message(ehandler, params, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_prefix_vwarning(struct sieve_error_handler *_ehandler, unsigned int flags,
-		      const char *location, const char *fmt, va_list args)
+sieve_prefix_vwarning(struct sieve_error_handler *_ehandler,
+		      const struct sieve_error_params *params,
+		      unsigned int flags, const char *fmt, va_list args)
 {
 	struct sieve_prefix_ehandler *ehandler =
 		(struct sieve_prefix_ehandler *) _ehandler;
+	struct sieve_error_params new_params = *params;
+
+	new_params.location = ehandler->location;
 
-	sieve_direct_warning(_ehandler->svinst, _ehandler->parent, flags,
-			     ehandler->location, "%s",
-			     _prefix_message(ehandler, location, fmt, args));
+	sieve_direct_warning(_ehandler->svinst, _ehandler->parent,
+			     &new_params, flags, "%s",
+			     _prefix_message(ehandler, params, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_prefix_vinfo(struct sieve_error_handler *_ehandler, unsigned int flags,
-		   const char *location, const char *fmt, va_list args)
+sieve_prefix_vinfo(struct sieve_error_handler *_ehandler,
+		   const struct sieve_error_params *params,
+		   unsigned int flags, const char *fmt, va_list args)
 {
 	struct sieve_prefix_ehandler *ehandler =
 		(struct sieve_prefix_ehandler *) _ehandler;
+	struct sieve_error_params new_params = *params;
 
-	sieve_direct_info(_ehandler->svinst, _ehandler->parent, flags,
-			  ehandler->location, "%s",
-			  _prefix_message(ehandler, location, fmt, args));
+	new_params.location = ehandler->location;
+
+	sieve_direct_info(_ehandler->svinst, _ehandler->parent,
+			  &new_params, flags, "%s",
+			  _prefix_message(ehandler, params, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
-sieve_prefix_vdebug(struct sieve_error_handler *_ehandler, unsigned int flags,
-		    const char *location, const char *fmt, va_list args)
+sieve_prefix_vdebug(struct sieve_error_handler *_ehandler,
+		    const struct sieve_error_params *params,
+		    unsigned int flags, const char *fmt, va_list args)
 {
 	struct sieve_prefix_ehandler *ehandler =
 		(struct sieve_prefix_ehandler *) _ehandler;
+	struct sieve_error_params new_params = *params;
+
+	new_params.location = ehandler->location;
 
-	sieve_direct_debug(_ehandler->svinst, _ehandler->parent, flags,
-			   ehandler->location, "%s",
-			   _prefix_message(ehandler, location, fmt, args));
+	sieve_direct_debug(_ehandler->svinst, _ehandler->parent,
+			   &new_params, flags, "%s",
+			   _prefix_message(ehandler, params, fmt, args));
 }
 
 struct sieve_error_handler *
@@ -1285,7 +1357,8 @@ struct sieve_varexpand_ehandler {
 };
 
 static const char *ATTR_FORMAT(3, 0)
-_expand_message(struct sieve_error_handler *_ehandler, const char *location,
+_expand_message(struct sieve_error_handler *_ehandler,
+		const struct sieve_error_params *params,
 		const char *fmt, va_list args)
 {
 	struct sieve_varexpand_ehandler *ehandler =
@@ -1299,7 +1372,7 @@ _expand_message(struct sieve_error_handler *_ehandler, const char *location,
 
 	/* Fill in substitution items */
 	table[0].value = t_strdup_vprintf(fmt, args);
-	table[1].value = location;
+	table[1].value = params->location;
 
 	/* Expand variables */
 	if (var_expand(str, ehandler->format, table, &error) <= 0 &&
@@ -1317,42 +1390,42 @@ _expand_message(struct sieve_error_handler *_ehandler, const char *location,
 
 static void ATTR_FORMAT(4, 0)
 sieve_varexpand_verror(struct sieve_error_handler *ehandler,
-		       unsigned int flags, const char *location,
-		       const char *fmt, va_list args)
+		       const struct sieve_error_params *params,
+		       unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_error(ehandler->svinst, ehandler->parent,
-			   flags, location, "%s",
-			   _expand_message(ehandler, location, fmt, args));
+			   params, flags, "%s",
+			   _expand_message(ehandler, params, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_varexpand_vwarning(struct sieve_error_handler *ehandler,
-			 unsigned int flags, const char *location,
-			 const char *fmt, va_list args)
+			 const struct sieve_error_params *params,
+			 unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_warning(ehandler->svinst, ehandler->parent,
-			    flags, location, "%s",
-			    _expand_message(ehandler, location, fmt, args));
+			     params, flags, "%s",
+			     _expand_message(ehandler, params, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_varexpand_vinfo(struct sieve_error_handler *ehandler,
-		      unsigned int flags, const char *location,
-		      const char *fmt, va_list args)
+		      const struct sieve_error_params *params,
+		      unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_info(ehandler->svinst, ehandler->parent,
-			  flags, location, "%s",
-			  _expand_message(ehandler, location, fmt, args));
+			  params, flags, "%s",
+			  _expand_message(ehandler, params, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
 sieve_varexpand_vdebug(struct sieve_error_handler *ehandler,
-		       unsigned int flags, const char *location,
-		       const char *fmt, va_list args)
+		       const struct sieve_error_params *params,
+		       unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_debug(ehandler->svinst, ehandler->parent,
-			   flags, location, "%s",
-			   _expand_message(ehandler, location, fmt, args));
+			   params, flags, "%s",
+			   _expand_message(ehandler, params, fmt, args));
 }
 
 struct sieve_error_handler *
diff --git a/src/lib-sieve/sieve-error.h b/src/lib-sieve/sieve-error.h
index ef7d4119d4ae720e02659a5116018db0484ac184..19dc0ce0e24c0da8b53d5e84934c02b95c6d32d8 100644
--- a/src/lib-sieve/sieve-error.h
+++ b/src/lib-sieve/sieve-error.h
@@ -20,8 +20,13 @@ struct sieve_error_handler;
  * Types
  */
 
+struct sieve_error_params {
+	/* Location in Sieve source script */
+	const char *location;
+};
+
 typedef void (*sieve_error_vfunc_t)(struct sieve_error_handler *ehandler,
-				    const char *location,
+				    const struct sieve_error_params *params,
 				    const char *fmt, va_list args)
 				    ATTR_FORMAT(3, 0);;
 typedef void (*sieve_error_func_t)(struct sieve_error_handler *ehandler,
@@ -42,23 +47,23 @@ sieve_system_ehandler_get(struct sieve_instance *svinst);
 
 void sieve_global_verror(struct sieve_instance *svinst,
 			 struct sieve_error_handler *ehandler,
-			 const char *location,
+			 const struct sieve_error_params *params,
 			 const char *fmt, va_list args) ATTR_FORMAT(4, 0);
 void sieve_global_vwarning(struct sieve_instance *svinst,
 			   struct sieve_error_handler *ehandler,
-			   const char *location,
+			   const struct sieve_error_params *params,
 			   const char *fmt, va_list args) ATTR_FORMAT(4, 0);
 void sieve_global_vinfo(struct sieve_instance *svinst,
 			struct sieve_error_handler *ehandler,
-			const char *location,
+			const struct sieve_error_params *params,
 			const char *fmt, va_list args) ATTR_FORMAT(4, 0);
 void sieve_global_info_verror(struct sieve_instance *svinst,
 			      struct sieve_error_handler *ehandler,
-			      const char *location,
+			      const struct sieve_error_params *params,
 			      const char *fmt, va_list args) ATTR_FORMAT(4, 0);
 void sieve_global_info_vwarning(struct sieve_instance *svinst,
 				struct sieve_error_handler *ehandler,
-				const char *location,
+				const struct sieve_error_params *params,
 				const char *fmt, va_list args)
 				ATTR_FORMAT(4, 0);
 
@@ -95,16 +100,21 @@ const char *
 sieve_error_script_location(const struct sieve_script *script,
 			    unsigned int source_line);
 
-void sieve_verror(struct sieve_error_handler *ehandler, const char *location,
+void sieve_verror(struct sieve_error_handler *ehandler,
+		  const struct sieve_error_params *params,
 		  const char *fmt, va_list args) ATTR_FORMAT(3, 0);
-void sieve_vwarning(struct sieve_error_handler *ehandler, const char *location,
+void sieve_vwarning(struct sieve_error_handler *ehandler,
+		    const struct sieve_error_params *params,
 		    const char *fmt, va_list args) ATTR_FORMAT(3, 0);
-void sieve_vinfo(struct sieve_error_handler *ehandler, const char *location,
+void sieve_vinfo(struct sieve_error_handler *ehandler,
+		 const struct sieve_error_params *params,
 		 const char *fmt, va_list args) ATTR_FORMAT(3, 0);
-void sieve_vdebug(struct sieve_error_handler *ehandler, const char *location,
+void sieve_vdebug(struct sieve_error_handler *ehandler,
+		  const struct sieve_error_params *params,
 		  const char *fmt, va_list args) ATTR_FORMAT(3, 0);
 void sieve_vcritical(struct sieve_instance *svinst,
-		     struct sieve_error_handler *ehandler, const char *location,
+		     struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
 		     const char *user_prefix, const char *fmt, va_list args)
 		     ATTR_FORMAT(5, 0);
 
diff --git a/src/lib-sieve/sieve-generator.c b/src/lib-sieve/sieve-generator.c
index 8eb016e0db237a5558e4a015a4cb753c1df3ec9f..4546201f5196a70001be4edeb7e526cd3a9b44a3 100644
--- a/src/lib-sieve/sieve-generator.c
+++ b/src/lib-sieve/sieve-generator.c
@@ -513,35 +513,47 @@ sieve_generator_run(struct sieve_generator *gentr,
 void sieve_generator_error(struct sieve_generator *gentr,
 			   unsigned int source_line, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
+	params.location =
+		sieve_error_script_location(gentr->genenv.script, source_line);
+
 	va_start(args, fmt);
-	sieve_verror(gentr->ehandler,
-        sieve_error_script_location(gentr->genenv.script, source_line),
-        fmt, args);
+	sieve_verror(gentr->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_generator_warning(struct sieve_generator *gentr,
 			     unsigned int source_line, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
+	params.location =
+		sieve_error_script_location(gentr->genenv.script, source_line);
+
 	va_start(args, fmt);
-	sieve_vwarning(gentr->ehandler,
-        sieve_error_script_location(gentr->genenv.script, source_line),
-        fmt, args);
+	sieve_vwarning(gentr->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_generator_critical(struct sieve_generator *gentr,
 			      unsigned int source_line, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
+	params.location =
+		sieve_error_script_location(gentr->genenv.script, source_line);
+
 	va_start(args, fmt);
-	sieve_vwarning(gentr->ehandler,
-        sieve_error_script_location(gentr->genenv.script, source_line),
-        fmt, args);
+	sieve_vwarning(gentr->ehandler, &params, fmt, args);
 	va_end(args);
 }
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 99ed58efc9f8d4b5dbf9b7dcf627897fcb7b5038..5614e251f36e694dc6a16ccaff72047d37869186 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -947,46 +947,59 @@ int sieve_interpreter_run(struct sieve_interpreter *interp,
  * Error handling
  */
 
-static inline void
-sieve_runtime_vmsg(const struct sieve_runtime_env *renv,
-		   sieve_error_vfunc_t msg_func, const char *location,
-		   const char *fmt, va_list args)
+static inline void ATTR_FORMAT(4, 0)
+sieve_runtime_logv(const struct sieve_runtime_env *renv,
+		   const struct sieve_error_params *params,
+		   sieve_error_vfunc_t msg_func, const char *fmt, va_list args)
 {
+	struct sieve_error_params new_params = *params;
+
 	T_BEGIN {
-		if (location == NULL)
-			location = sieve_runtime_get_full_command_location(renv);
+		if (new_params.location == NULL) {
+			new_params.location =
+				sieve_runtime_get_full_command_location(renv);
+		}
 
-		msg_func(renv->ehandler, location, fmt, args);
+		msg_func(renv->ehandler, params, fmt, args);
 	} T_END;
 }
 
 void sieve_runtime_error(const struct sieve_runtime_env *renv,
 			 const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_runtime_vmsg(renv, sieve_verror, location, fmt, args);
+	sieve_runtime_logv(renv, &params, sieve_verror, fmt, args);
 	va_end(args);
 }
 
 void sieve_runtime_warning(const struct sieve_runtime_env *renv,
 			   const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_runtime_vmsg(renv, sieve_vwarning, location, fmt, args);
+	sieve_runtime_logv(renv, &params, sieve_vwarning, fmt, args);
 	va_end(args);
 }
 
 void sieve_runtime_log(const struct sieve_runtime_env *renv,
 		       const char *location, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_runtime_vmsg(renv, sieve_vinfo, location, fmt, args);
+	sieve_runtime_logv(renv, &params, sieve_vinfo, fmt, args);
 	va_end(args);
 }
 
@@ -994,15 +1007,20 @@ void sieve_runtime_critical(const struct sieve_runtime_env *renv,
 			    const char *location, const char *user_prefix,
 			    const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = location,
+	};
 	va_list args;
 
 	va_start(args, fmt);
 
 	T_BEGIN {
-		if (location == NULL)
-			location = sieve_runtime_get_full_command_location(renv);
+		if (params.location == NULL) {
+			params.location =
+				sieve_runtime_get_full_command_location(renv);
+		}
 
-		sieve_vcritical(renv->svinst, renv->ehandler, location,
+		sieve_vcritical(renv->svinst, renv->ehandler, &params,
 				user_prefix, fmt, args);
 	} T_END;
 
diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c
index f20b4ef95c49cfc4bd2bf07cd76129726677f842..30678b71cf6bbd5d73ab45cf72cfb905b1031cc0 100644
--- a/src/lib-sieve/sieve-lexer.c
+++ b/src/lib-sieve/sieve-lexer.c
@@ -124,15 +124,18 @@ inline static void ATTR_FORMAT(2, 3)
 sieve_lexer_error(const struct sieve_lexer *lexer, const char *fmt, ...)
 {
 	struct sieve_lexical_scanner *scanner = lexer->scanner;
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_verror(scanner->ehandler,
-			     sieve_error_script_location(
-					scanner->script, scanner->current_line),
-			     fmt, args);
+		params.location =
+			sieve_error_script_location(scanner->script,
+						    scanner->current_line);
+		sieve_verror(scanner->ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
@@ -142,15 +145,18 @@ inline static void ATTR_FORMAT(2, 3)
 sieve_lexer_warning(const struct sieve_lexer *lexer, const char *fmt, ...)
 {
 	struct sieve_lexical_scanner *scanner = lexer->scanner;
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
 
 	T_BEGIN {
-		sieve_vwarning(scanner->ehandler,
-			       sieve_error_script_location(
-					scanner->script, scanner->current_line),
-			       fmt, args);
+		params.location =
+			sieve_error_script_location(scanner->script,
+						    scanner->current_line);
+		sieve_vwarning(scanner->ehandler, &params, fmt, args);
 	} T_END;
 
 	va_end(args);
diff --git a/src/lib-sieve/sieve-parser.c b/src/lib-sieve/sieve-parser.c
index 82eaa59922549284ca010700c52912e9b7d2d6b1..dfe67c550900ab74fce190aaa715b72a565a4e6b 100644
--- a/src/lib-sieve/sieve-parser.c
+++ b/src/lib-sieve/sieve-parser.c
@@ -91,6 +91,9 @@ void sieve_parser_free(struct sieve_parser **parser)
 inline static void ATTR_FORMAT(2, 3)
 sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
@@ -98,10 +101,10 @@ sieve_parser_error(struct sieve_parser *parser, const char *fmt, ...)
 	/* Don't report a parse error if the lexer complained already */
 	if (sieve_lexer_token_type(parser->lexer) != STT_ERROR) {
 		T_BEGIN {
-			sieve_verror(parser->ehandler,
-				sieve_error_script_location(parser->script,
-					sieve_lexer_token_line(parser->lexer)),
-				fmt, args);
+			params.location = sieve_error_script_location(
+				parser->script,
+				sieve_lexer_token_line(parser->lexer));
+			sieve_verror(parser->ehandler, &params, fmt, args);
 		} T_END;
 	}
 
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index f37bb476f1e1f52686ec81f229d14ede9818a75a..184eada5b72aefdb48bb6a39b747a6d2c60a7a1f 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -1533,80 +1533,106 @@ void sieve_side_effects_list_add(struct sieve_side_effects_list *list,
 void sieve_result_error(const struct sieve_action_exec_env *aenv,
 			const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_verror(aenv->ehandler, NULL, fmt, args);
+	sieve_verror(aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_result_global_error(const struct sieve_action_exec_env *aenv,
 			       const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_verror(aenv->svinst, aenv->ehandler, NULL, fmt, args);
+	sieve_global_verror(aenv->svinst, aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_result_warning(const struct sieve_action_exec_env *aenv,
 			  const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_vwarning(aenv->ehandler, NULL, fmt, args);
+	sieve_vwarning(aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_result_global_warning(const struct sieve_action_exec_env *aenv,
 				 const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_vwarning(aenv->svinst, aenv->ehandler, NULL, fmt, args);
+	sieve_global_vwarning(aenv->svinst, aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_result_log(const struct sieve_action_exec_env *aenv,
 		      const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_vinfo(aenv->ehandler, NULL, fmt, args);
+	sieve_vinfo(aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_result_global_log(const struct sieve_action_exec_env *aenv,
 			     const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_vinfo(aenv->svinst, aenv->ehandler, NULL, fmt, args);
+	sieve_global_vinfo(aenv->svinst, aenv->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_result_global_log_error(const struct sieve_action_exec_env *aenv,
 				   const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_info_verror(aenv->svinst, aenv->ehandler, NULL, fmt, args);
+	sieve_global_info_verror(aenv->svinst, aenv->ehandler, &params,
+				 fmt, args);
 	va_end(args);
 }
 
 void sieve_result_global_log_warning(const struct sieve_action_exec_env *aenv,
 				     const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
 	va_start(args, fmt);
-	sieve_global_info_vwarning(aenv->svinst, aenv->ehandler, NULL, fmt, args);
+	sieve_global_info_vwarning(aenv->svinst, aenv->ehandler, &params,
+				   fmt, args);
 	va_end(args);
 }
 
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index 017dc4fa5602ceff1b7d7d09d251136a36dabbd0..cc49bb610fc72d738c4093b2dd35fb2958de717f 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -1662,24 +1662,32 @@ sieve_validator_object_registry_init(struct sieve_validator *valdtr,
 void sieve_validator_error(struct sieve_validator *valdtr,
 			   unsigned int source_line, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
+	params.location =
+		sieve_error_script_location(valdtr->script, source_line);
+
 	va_start(args, fmt);
-	sieve_verror(valdtr->ehandler,
-		     sieve_error_script_location(valdtr->script, source_line),
-		     fmt, args);
+	sieve_verror(valdtr->ehandler, &params, fmt, args);
 	va_end(args);
 }
 
 void sieve_validator_warning(struct sieve_validator *valdtr,
 			     unsigned int source_line, const char *fmt, ...)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	va_list args;
 
+	params.location =
+		sieve_error_script_location(valdtr->script, source_line);
+
 	va_start(args, fmt);
-	sieve_vwarning(valdtr->ehandler,
-		       sieve_error_script_location(valdtr->script, source_line),
-		       fmt, args);
+	sieve_vwarning(valdtr->ehandler, &params, fmt, args);
 	va_end(args);
 
 }
diff --git a/src/plugins/lda-sieve/lda-sieve-log.c b/src/plugins/lda-sieve/lda-sieve-log.c
index 8975bc8b3d12acbdebb28777e97850434514d0df..98669a81d299ced82ce2afcbe1ae8059326e570a 100644
--- a/src/plugins/lda-sieve/lda-sieve-log.c
+++ b/src/plugins/lda-sieve/lda-sieve-log.c
@@ -41,38 +41,42 @@ lda_sieve_log_expand_message(struct sieve_error_handler *_ehandler,
 }
 
 static void ATTR_FORMAT(4, 0)
-lda_sieve_log_verror(struct sieve_error_handler *ehandler, unsigned int flags,
-		     const char *location, const char *fmt, va_list args)
+lda_sieve_log_verror(struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
+		     unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_error(ehandler->svinst, ehandler->parent,
-			   flags, location, "%s",
+			   params, flags, "%s",
 			   lda_sieve_log_expand_message(ehandler, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
-lda_sieve_log_vwarning(struct sieve_error_handler *ehandler, unsigned int flags,
-		       const char *location, const char *fmt, va_list args)
+lda_sieve_log_vwarning(struct sieve_error_handler *ehandler,
+		       const struct sieve_error_params *params,
+		       unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_warning(ehandler->svinst, ehandler->parent,
-			    flags, location, "%s",
-			    lda_sieve_log_expand_message(ehandler, fmt, args));
+			     params, flags, "%s",
+			     lda_sieve_log_expand_message(ehandler, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
-lda_sieve_log_vinfo(struct sieve_error_handler *ehandler, unsigned int flags,
-		    const char *location, const char *fmt, va_list args)
+lda_sieve_log_vinfo(struct sieve_error_handler *ehandler,
+		    const struct sieve_error_params *params,
+		    unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_info(ehandler->svinst, ehandler->parent,
-			  flags, location, "%s",
+			  params, flags, "%s",
 			  lda_sieve_log_expand_message(ehandler, fmt, args));
 }
 
 static void ATTR_FORMAT(4, 0)
-lda_sieve_log_vdebug(struct sieve_error_handler *ehandler, unsigned int flags,
-		     const char *location, const char *fmt, va_list args)
+lda_sieve_log_vdebug(struct sieve_error_handler *ehandler,
+		     const struct sieve_error_params *params,
+		     unsigned int flags, const char *fmt, va_list args)
 {
 	sieve_direct_debug(ehandler->svinst, ehandler->parent,
-			   flags, location, "%s",
+			   params, flags, "%s",
 			   lda_sieve_log_expand_message(ehandler, fmt, args));
 }
 
diff --git a/src/testsuite/testsuite-log.c b/src/testsuite/testsuite-log.c
index 6ddbbad166407fa5f526059487ddd285326430ae..84ca4c55bcbc7c332fc747805291676cde34fd29 100644
--- a/src/testsuite/testsuite-log.c
+++ b/src/testsuite/testsuite-log.c
@@ -36,19 +36,20 @@ ARRAY(struct _testsuite_log_message) _testsuite_log_warnings;
 ARRAY(struct _testsuite_log_message) _testsuite_log_messages;
 
 static inline void ATTR_FORMAT(3, 0)
-_testsuite_stdout_vlog(const char *prefix, const char *location,
-		       const char *fmt, va_list args)
+_testsuite_stdout_vlog(const struct sieve_error_params *params,
+		       const char *prefix, const char *fmt, va_list args)
 {
 	if (_testsuite_log_stdout) {
 		va_list args_copy;
 
 		VA_COPY(args_copy, args);
-		if (location == NULL || *location == '\0') {
-			fprintf(stdout, "LOG: %s: %s\n", prefix,
-				t_strdup_vprintf(fmt, args_copy));
+		if (params->location == NULL || *params->location == '\0') {
+			fprintf(stdout, "LOG: %s: %s\n",
+				prefix, t_strdup_vprintf(fmt, args_copy));
 		} else {
-			fprintf(stdout,	"LOG: %s: %s: %s\n", prefix,
-				location, t_strdup_vprintf(fmt, args_copy));
+			fprintf(stdout, "LOG: %s: %s: %s\n",
+				prefix, params->location,
+				t_strdup_vprintf(fmt, args_copy));
 		}
 		va_end(args_copy);
 	}
@@ -56,15 +57,16 @@ _testsuite_stdout_vlog(const char *prefix, const char *location,
 
 static void ATTR_FORMAT(4, 0)
 _testsuite_log_verror(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      unsigned int flags ATTR_UNUSED, const char *location,
+		      const struct sieve_error_params *params,
+		      unsigned int flags ATTR_UNUSED,
 		      const char *fmt, va_list args)
 {
 	pool_t pool = _testsuite_logmsg_pool;
 	struct _testsuite_log_message msg;
 
-	_testsuite_stdout_vlog("error", location, fmt, args);
+	_testsuite_stdout_vlog(params, "error", fmt, args);
 
-	msg.location = p_strdup(pool, location);
+	msg.location = p_strdup(pool, params->location);
 	msg.message = p_strdup_vprintf(pool, fmt, args);
 
 	array_append(&_testsuite_log_errors, &msg, 1);
@@ -72,29 +74,31 @@ _testsuite_log_verror(struct sieve_error_handler *ehandler ATTR_UNUSED,
 
 static void ATTR_FORMAT(4, 0)
 _testsuite_log_main_verror(struct sieve_error_handler *ehandler ATTR_UNUSED,
-			   unsigned int flags ATTR_UNUSED, const char *location,
+			   const struct sieve_error_params *params,
+			   unsigned int flags ATTR_UNUSED,
 			   const char *fmt, va_list args)
 {
-	if (location == NULL || *location == '\0') {
+	if (params->location == NULL || *params->location == '\0') {
 		fprintf(stderr, "error: %s\n",
 			t_strdup_vprintf(fmt, args));
 	} else {
 		fprintf(stderr, "%s: error: %s\n",
-			location, t_strdup_vprintf(fmt, args));
+			params->location, t_strdup_vprintf(fmt, args));
 	}
 }
 
 static void ATTR_FORMAT(4, 0)
 _testsuite_log_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED,
-			unsigned int flags ATTR_UNUSED, const char *location,
+			const struct sieve_error_params *params,
+			unsigned int flags ATTR_UNUSED,
 			const char *fmt, va_list args)
 {
 	pool_t pool = _testsuite_logmsg_pool;
 	struct _testsuite_log_message msg;
 
-	_testsuite_stdout_vlog("warning", location, fmt, args);
+	_testsuite_stdout_vlog(params, "warning", fmt, args);
 
-	msg.location = p_strdup(pool, location);
+	msg.location = p_strdup(pool, params->location);
 	msg.message = p_strdup_vprintf(pool, fmt, args);
 
 	array_append(&_testsuite_log_warnings, &msg, 1);
@@ -102,15 +106,16 @@ _testsuite_log_vwarning(struct sieve_error_handler *ehandler ATTR_UNUSED,
 
 static void ATTR_FORMAT(4, 0)
 _testsuite_log_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		     unsigned int flags ATTR_UNUSED, const char *location,
+		     const struct sieve_error_params *params,
+		     unsigned int flags ATTR_UNUSED,
 		     const char *fmt, va_list args)
 {
 	pool_t pool = _testsuite_logmsg_pool;
 	struct _testsuite_log_message msg;
 
-	_testsuite_stdout_vlog("info", location, fmt, args);
+	_testsuite_stdout_vlog(params, "info", fmt, args);
 
-	msg.location = p_strdup(pool, location);
+	msg.location = p_strdup(pool, params->location);
 	msg.message = p_strdup_vprintf(pool, fmt, args);
 
 	array_append(&_testsuite_log_messages, &msg, 1);
@@ -118,10 +123,11 @@ _testsuite_log_vinfo(struct sieve_error_handler *ehandler ATTR_UNUSED,
 
 static void ATTR_FORMAT(4, 0)
 _testsuite_log_vdebug(struct sieve_error_handler *ehandler ATTR_UNUSED,
-		      unsigned int flags ATTR_UNUSED, const char *location,
+		      const struct sieve_error_params *params,
+		      unsigned int flags ATTR_UNUSED,
 		      const char *fmt, va_list args)
 {
-	_testsuite_stdout_vlog("debug", location, fmt, args);
+	_testsuite_stdout_vlog(params, "debug", fmt, args);
 }
 
 static struct sieve_error_handler *_testsuite_log_ehandler_create(void)
@@ -164,28 +170,31 @@ static void ATTR_FORMAT(2, 0)
 testsuite_error_handler(const struct failure_context *ctx, const char *fmt,
 			va_list args)
 {
+	struct sieve_error_params params = {
+		.location = NULL,
+	};
 	pool_t pool = _testsuite_logmsg_pool;
 	struct _testsuite_log_message msg;
 
 	i_zero(&msg);
 	switch (ctx->type) {
 	case LOG_TYPE_DEBUG:
-		_testsuite_stdout_vlog("debug", NULL, fmt, args);
+		_testsuite_stdout_vlog(&params, "debug", fmt, args);
 		break;
 	case LOG_TYPE_INFO:
-		_testsuite_stdout_vlog("info", NULL, fmt, args);
+		_testsuite_stdout_vlog(&params, "info", fmt, args);
 
 		msg.message = p_strdup_vprintf(pool, fmt, args);
 		array_append(&_testsuite_log_messages, &msg, 1);
 		break;
 	case LOG_TYPE_WARNING:
-		_testsuite_stdout_vlog("warning", NULL, fmt, args);
+		_testsuite_stdout_vlog(&params, "warning", fmt, args);
 
 		msg.message = p_strdup_vprintf(pool, fmt, args);
 		array_append(&_testsuite_log_warnings, &msg, 1);
 		break;
 	case LOG_TYPE_ERROR:
-		_testsuite_stdout_vlog("error", NULL, fmt, args);
+		_testsuite_stdout_vlog(&params, "error", fmt, args);
 
 		msg.message = p_strdup_vprintf(pool, fmt, args);
 		array_append(&_testsuite_log_errors, &msg, 1);