From 7e9e61655ee2377956759180c30a3734d1d0fc10 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 24 May 2017 21:29:49 +0300 Subject: [PATCH] lib-storage: Fix mail_storage_set_critical() when input parameter is an old internal error This could have caused garbage in the error string. --- src/lib-storage/mail-storage.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 0ba25436ca..7ad9a1fc51 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -518,15 +518,19 @@ void mail_storage_set_internal_error(struct mail_storage *storage) 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. */