]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: Fix smtp_client_command_name_equals() to work properly after the...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 23 Dec 2017 21:49:57 +0000 (22:49 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Mar 2018 05:01:59 +0000 (07:01 +0200)
At command submission, CRLF is appended to command data. This messed up the name comparison.
This in turn caused a spurious QUIT command to be sent to the server at connection close.

src/lib-smtp/smtp-client-command.c

index cae29e809a160bbc333a14dcefaf56467e814620..486cd6a73599185ecba5b9a47c4f38ec46ec2f95 100644 (file)
@@ -159,18 +159,25 @@ bool smtp_client_command_name_equals(struct smtp_client_command *cmd,
                                     const char *name)
 {
        const unsigned char *data;
-       size_t name_len;
+       size_t name_len, data_len;
 
        if (cmd->data == NULL)
                return FALSE;
 
-       data = cmd->data->data;
        name_len = strlen(name);
-       if (cmd->data->used < name_len ||
+       data = cmd->data->data;
+       data_len = cmd->data->used;
+
+       if (cmd->state >= SMTP_CLIENT_COMMAND_STATE_SUBMITTED) {
+               /* ignore CRLF, which is added at command submission */
+               i_assert(data_len >= 2);
+               data_len -= 2;
+       }
+
+       if (data_len < name_len ||
                i_memcasecmp(data, name, name_len) != 0)
                return FALSE;
-       return (cmd->data->used == name_len ||
-               data[name_len] == ' ');
+       return (data_len == name_len || data[name_len] == ' ');
 }
 
 void smtp_client_command_lock(struct smtp_client_command *cmd)