From e6c9e368d438a3f11c3aaeebe12417c0579f6a40 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sat, 29 Sep 2018 20:54:03 +0200 Subject: [PATCH] lib-smtp: client: Properly manage command timeout during transaction. --- src/lib-smtp/smtp-client-command.c | 13 ++++++++++++- src/lib-smtp/smtp-client-connection.c | 10 ++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/lib-smtp/smtp-client-command.c b/src/lib-smtp/smtp-client-command.c index 546af8992b..debeceeac2 100644 --- a/src/lib-smtp/smtp-client-command.c +++ b/src/lib-smtp/smtp-client-command.c @@ -522,7 +522,7 @@ smtp_client_command_send_stream(struct smtp_client_command *cmd) i_unreached(); } -int smtp_client_command_send_more(struct smtp_client_connection *conn) +static int smtp_client_command_do_send_more(struct smtp_client_connection *conn) { struct smtp_client_command *cmd; const char *data; @@ -621,6 +621,17 @@ int smtp_client_command_send_more(struct smtp_client_connection *conn) return 0; } +int smtp_client_command_send_more(struct smtp_client_connection *conn) +{ + int ret; + + if ((ret=smtp_client_command_do_send_more(conn)) < 0) + return -1; + + smtp_client_connection_update_cmd_timeout(conn); + return ret; +} + static void smtp_client_command_disconnected(struct smtp_client_connection *conn) { diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index 3e48e8473a..fc553279dd 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -228,7 +228,7 @@ void smtp_client_connection_start_cmd_timeout( { unsigned int msecs = conn->set.command_timeout_msecs; - if (conn->state != SMTP_CLIENT_CONNECTION_STATE_READY) { + if (conn->state < SMTP_CLIENT_CONNECTION_STATE_READY) { /* pre-login uses connect timeout */ return; } @@ -237,8 +237,7 @@ void smtp_client_connection_start_cmd_timeout( timeout_remove(&conn->to_commands); return; } - if (conn->cmd_wait_list_head == NULL && - conn->cmd_send_queue_head == NULL) { + if (conn->cmd_wait_list_head == NULL && !conn->sending_command) { /* no commands pending */ timeout_remove(&conn->to_commands); return; @@ -256,7 +255,7 @@ void smtp_client_connection_update_cmd_timeout( { unsigned int msecs = conn->set.command_timeout_msecs; - if (conn->state != SMTP_CLIENT_CONNECTION_STATE_READY) { + if (conn->state < SMTP_CLIENT_CONNECTION_STATE_READY) { /* pre-login uses connect timeout */ return; } @@ -266,8 +265,7 @@ void smtp_client_connection_update_cmd_timeout( return; } - if (conn->cmd_wait_list_head == NULL && - conn->cmd_send_queue_head == NULL) { + if (conn->cmd_wait_list_head == NULL && !conn->sending_command) { if (conn->to_commands != NULL) { smtp_client_connection_debug(conn, "No commands pending; stop timeout"); -- 2.47.3