From: Stephan Bosch Date: Sat, 23 Dec 2017 21:49:57 +0000 (+0100) Subject: lib-smtp: client: Fix smtp_client_command_name_equals() to work properly after the... X-Git-Tag: 2.3.1~65 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ee9ceafb202ec66f053b10f7f91cc3b6f27ab132;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: Fix smtp_client_command_name_equals() to work properly after the command is submitted. 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. --- diff --git a/src/lib-smtp/smtp-client-command.c b/src/lib-smtp/smtp-client-command.c index cae29e809a..486cd6a735 100644 --- a/src/lib-smtp/smtp-client-command.c +++ b/src/lib-smtp/smtp-client-command.c @@ -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)