From 615d91af7a54fe9e77852e59d051474b7a9c5685 Mon Sep 17 00:00:00 2001 From: Stephan Bosch Date: Sun, 11 Nov 2018 20:32:09 +0100 Subject: [PATCH] lib-smtp: client: connection: Prevent timeout leak for transaction start. Perform timeout management in a single place. Also, always start the next transaction only through a timeout. --- src/lib-smtp/smtp-client-connection.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/lib-smtp/smtp-client-connection.c b/src/lib-smtp/smtp-client-connection.c index a37aa38d1f..c4591189e3 100644 --- a/src/lib-smtp/smtp-client-connection.c +++ b/src/lib-smtp/smtp-client-connection.c @@ -2078,7 +2078,7 @@ smtp_client_connection_reset(struct smtp_client_connection *conn) } static void -smtp_client_connection_start_transaction(struct smtp_client_connection *conn) +smtp_client_connection_do_start_transaction(struct smtp_client_connection *conn) { struct smtp_reply reply; @@ -2101,6 +2101,18 @@ smtp_client_connection_start_transaction(struct smtp_client_connection *conn) conn->transactions_head, &reply); } +static void +smtp_client_connection_start_transaction(struct smtp_client_connection *conn) +{ + if (conn->state != SMTP_CLIENT_CONNECTION_STATE_READY) + return; + if (conn->to_trans != NULL) + return; + + conn->to_trans = timeout_add_short(0, + smtp_client_connection_do_start_transaction, conn); +} + void smtp_client_connection_add_transaction( struct smtp_client_connection *conn, struct smtp_client_transaction *trans) @@ -2111,11 +2123,7 @@ void smtp_client_connection_add_transaction( &conn->transactions_tail, trans); smtp_client_connection_connect(conn, NULL, NULL); - - if (conn->state == SMTP_CLIENT_CONNECTION_STATE_READY) { - conn->to_trans = timeout_add_short(0, - smtp_client_connection_start_transaction, conn); - } + smtp_client_connection_start_transaction(conn); } void smtp_client_connection_abort_transaction( @@ -2141,8 +2149,7 @@ void smtp_client_connection_abort_transaction( smtp_client_connection_set_state(conn, SMTP_CLIENT_CONNECTION_STATE_READY); - conn->to_trans = timeout_add_short(0, - smtp_client_connection_start_transaction, conn); + smtp_client_connection_start_transaction(conn); } void smtp_client_connection_next_transaction( @@ -2162,6 +2169,5 @@ void smtp_client_connection_next_transaction( smtp_client_connection_set_state(conn, SMTP_CLIENT_CONNECTION_STATE_READY); - conn->to_trans = timeout_add_short(0, - smtp_client_connection_start_transaction, conn); + smtp_client_connection_start_transaction(conn); }