]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: server: Fix overwriting a previously submitted reply.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 27 Jan 2018 23:10:11 +0000 (00:10 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Mar 2018 05:29:58 +0000 (07:29 +0200)
The submitted flag was not reset, nor was the replies_submitted counter
decreased. This caused assertion failures.

src/lib-smtp/smtp-server-reply.c

index 2656fd548dd2c4f5f78fb749caa9587fecf6b1c9..2ad013ca0cd71c38bba0526025395eb85b4edb94 100644 (file)
@@ -50,7 +50,7 @@ smtp_server_reply_debug(struct smtp_server_reply *reply,
  * Reply
  */
 
-static void smtp_server_reply_clear(struct smtp_server_reply *reply)
+static void smtp_server_reply_destroy(struct smtp_server_reply *reply)
 {
        if (reply->command == NULL)
                return;
@@ -62,6 +62,16 @@ static void smtp_server_reply_clear(struct smtp_server_reply *reply)
        str_free(&reply->content->text);
 }
 
+static void smtp_server_reply_clear(struct smtp_server_reply *reply)
+{
+       smtp_server_reply_destroy(reply);
+       if (reply->submitted) {
+               i_assert(reply->command->replies_submitted > 0);
+               reply->command->replies_submitted--;
+       }
+       reply->submitted = FALSE;
+}
+
 static struct smtp_server_reply *
 smtp_server_reply_alloc(struct smtp_server_command *cmd, unsigned int index)
 {
@@ -160,7 +170,7 @@ void smtp_server_reply_free(struct smtp_server_command *cmd)
        for (i = 0; i < cmd->replies_expected; i++) {
                struct smtp_server_reply *reply =
                        array_idx_modifiable(&cmd->replies, i);
-               smtp_server_reply_clear(reply);
+               smtp_server_reply_destroy(reply);
        }
 }