]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login-proxy: login_proxy_starttls() - destroy proxy internally on failure
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 29 Apr 2020 12:18:55 +0000 (15:18 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 25 May 2020 08:38:55 +0000 (08:38 +0000)
src/imap-login/imap-proxy.c
src/login-common/login-proxy.c
src/pop3-login/pop3-proxy.c
src/submission-login/submission-proxy.c

index 18f7b95cd5aa7e6b90a2c880ea0f4bea9b221982..35bebec5b0ad741a59a87c72d5181c1f6d53d992 100644 (file)
@@ -325,10 +325,8 @@ int imap_proxy_parse_line(struct client *client, const char *line)
                        return -1;
                }
                /* STARTTLS successful, begin TLS negotiation. */
-               if (login_proxy_starttls(client->login_proxy) < 0) {
-                       client_proxy_failed(client, TRUE);
+               if (login_proxy_starttls(client->login_proxy) < 0)
                        return -1;
-               }
                /* i/ostreams changed. */
                output = login_proxy_get_ostream(client->login_proxy);
                str = t_str_new(128);
index c67727235e3b51069084f518086b5e448791b3fd..e7ca61d7bf90d222d52b0a614dc83c220073fea2 100644 (file)
@@ -284,8 +284,7 @@ static void proxy_wait_connect(struct login_proxy *proxy)
        if ((proxy->ssl_flags & PROXY_SSL_FLAG_YES) != 0 &&
            (proxy->ssl_flags & PROXY_SSL_FLAG_STARTTLS) == 0) {
                if (login_proxy_starttls(proxy) < 0) {
-                       login_proxy_free(&proxy);
-                       return;
+                       /* proxy is already destroyed */
                }
        }
 }
@@ -702,6 +701,7 @@ int login_proxy_starttls(struct login_proxy *proxy)
        if (ssl_iostream_client_context_cache_get(&ssl_set, &ssl_ctx, &error) < 0) {
                e_error(proxy->event, "Failed to create SSL client context: %s",
                        error);
+               client_proxy_failed(proxy->client, TRUE);
                return -1;
        }
 
@@ -711,6 +711,7 @@ int login_proxy_starttls(struct login_proxy *proxy)
                                        &proxy->server_ssl_iostream,
                                        &error) < 0) {
                e_error(proxy->event, "Failed to create SSL client: %s", error);
+               client_proxy_failed(proxy->client, TRUE);
                ssl_iostream_context_unref(&ssl_ctx);
                return -1;
        }
@@ -719,6 +720,7 @@ int login_proxy_starttls(struct login_proxy *proxy)
                error = ssl_iostream_get_last_error(proxy->server_ssl_iostream);
                e_error(proxy->event, "Failed to start SSL handshake: %s",
                        ssl_iostream_get_last_error(proxy->server_ssl_iostream));
+               client_proxy_failed(proxy->client, TRUE);
                return -1;
        }
 
index 746e4ee93291849041033186985730a7db6c88d1..0c32c9da5f6d7789b9a9b5f58d269083a9a4eb5b 100644 (file)
@@ -184,10 +184,8 @@ int pop3_proxy_parse_line(struct client *client, const char *line)
                        client_proxy_failed(client, TRUE);
                        return -1;
                }
-               if (login_proxy_starttls(client->login_proxy) < 0) {
-                       client_proxy_failed(client, TRUE);
+               if (login_proxy_starttls(client->login_proxy) < 0)
                        return -1;
-               }
                /* i/ostreams changed. */
                output = login_proxy_get_ostream(client->login_proxy);
                if (proxy_send_login(pop3_client, output) < 0)
index 622b3470f7636ea0cdcfaa0246af453b8d1824da..82d968785b270fe371c69f7eb4e3961ad4412d35 100644 (file)
@@ -353,10 +353,8 @@ int submission_proxy_parse_line(struct client *client, const char *line)
                }
                if (!last_line)
                        return 0;
-               if (login_proxy_starttls(client->login_proxy) < 0) {
-                       client_proxy_failed(client, TRUE);
+               if (login_proxy_starttls(client->login_proxy) < 0)
                        return -1;
-               }
                /* i/ostreams changed. */
                output = login_proxy_get_ostream(client->login_proxy);