]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: connection: Prevent timeout leak for transaction start.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sun, 11 Nov 2018 19:32:09 +0000 (20:32 +0100)
committerMartti Rannanjärvi <martti.rannanjarvi@open-xchange.com>
Mon, 18 Feb 2019 08:23:46 +0000 (10:23 +0200)
Perform timeout management in a single place. Also, always start the next
transaction only through a timeout.

src/lib-smtp/smtp-client-connection.c

index a37aa38d1f374f386546dc1eee68344814df11c3..c4591189e369445b4718bac64289ff305b2302a8 100644 (file)
@@ -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);
 }