From: Stephan Bosch Date: Fri, 14 Jan 2022 03:02:09 +0000 (+0100) Subject: submission: submission-backend-relay - Make sure QUIT command yields 221 when relay... X-Git-Tag: 2.3.19~128 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bcdc6ef0ec7e448f9b8936e4fa0eae79adaffc6d;p=thirdparty%2Fdovecot%2Fcore.git submission: submission-backend-relay - Make sure QUIT command yields 221 when relay connection is closed normally. Before, it would sometimes erroneously treat the closing connection as a "connection lost" 421 situation. --- diff --git a/src/submission/submission-backend-relay.c b/src/submission/submission-backend-relay.c index 6d93b64257..eededa043f 100644 --- a/src/submission/submission-backend-relay.c +++ b/src/submission/submission-backend-relay.c @@ -21,6 +21,7 @@ struct submission_backend_relay { bool trans_started:1; bool trusted:1; + bool quit_confirmed:1; }; static struct submission_backend_vfuncs backend_relay_vfuncs; @@ -114,6 +115,8 @@ backend_relay_handle_relay_reply(struct submission_backend_relay *backend, break; case SMTP_CLIENT_COMMAND_ERROR_CONNECTION_LOST: case SMTP_CLIENT_COMMAND_ERROR_CONNECTION_CLOSED: + if (backend->quit_confirmed) + return FALSE; detail = " (connection lost)"; break; case SMTP_CLIENT_COMMAND_ERROR_BAD_REPLY: @@ -978,6 +981,7 @@ static void relay_cmd_quit_finish(struct relay_cmd_quit_context *quit_cmd) { struct smtp_server_cmd_ctx *cmd = quit_cmd->cmd; + quit_cmd->backend->quit_confirmed = TRUE; if (quit_cmd->cmd_relayed != NULL) smtp_client_command_abort(&quit_cmd->cmd_relayed); smtp_server_reply_quit(cmd); @@ -1004,6 +1008,7 @@ static void relay_cmd_quit_relay(struct relay_cmd_quit_context *quit_cmd) < SMTP_CLIENT_CONNECTION_STATE_READY) { /* Don't bother relaying QUIT command when relay is not fully initialized. */ + quit_cmd->backend->quit_confirmed = TRUE; smtp_server_reply_quit(cmd); return; }