]> 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)
committerStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 23 Dec 2017 21:49:57 +0000 (22:49 +0100)
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 41a986b61fc44ffe54866a67720d74a2c33c245e..d96a61836d4b823a5d77f24e551be90fb46a6db9 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)