changeset 22085:4d0e41451da1

lib-storage: Fix mail_storage_set_critical() when input parameter is an old internal error This could have caused garbage in the error string.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 24 May 2017 21:29:49 +0300
parents 540b5d44c561
children 4755135cb895
files src/lib-storage/mail-storage.c
diffstat 1 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-storage.c	Wed May 24 19:16:03 2017 +0300
+++ b/src/lib-storage/mail-storage.c	Wed May 24 21:29:49 2017 +0300
@@ -518,15 +518,19 @@
 void mail_storage_set_critical(struct mail_storage *storage,
 			       const char *fmt, ...)
 {
+	char *old_error = storage->last_internal_error;
 	va_list va;
 
-	i_free(storage->last_internal_error);
 	va_start(va, fmt);
 	storage->last_internal_error = i_strdup_vprintf(fmt, va);
 	va_end(va);
 	storage->last_error_is_internal = TRUE;
 	i_error("%s", storage->last_internal_error);
 
+	/* free the old_error only after the new error is generated, because
+	   the old_error may be one of the parameters. */
+	i_free(old_error);
+
 	/* critical errors may contain sensitive data, so let user
 	   see only "Internal error" with a timestamp to make it
 	   easier to look from log files the actual error message. */