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. */