]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-imap-client: Do not reset ips when reconnecting
authorAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 5 Apr 2017 11:22:38 +0000 (14:22 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 6 Apr 2017 17:22:41 +0000 (20:22 +0300)
Avoids infinite loop

src/lib-imap-client/imapc-connection.c

index 0fe223b74ec048e359a46fec20cf2bb5d8f24eaf..07d6727333492b92f8ed9f1f38d0d9cee188c720 100644 (file)
@@ -373,18 +373,17 @@ static void imapc_connection_set_state(struct imapc_connection *conn,
                        i_free_and_null(conn->disconnect_reason);
                }
                reply.text_without_resp = reply.text_full;
-               if (!conn->reconnecting)
+               if (!conn->reconnecting) {
                        imapc_login_callback(conn, &reply);
-
+                       i_free(conn->ips);
+                       conn->ips_count = 0;
+               }
                conn->idling = FALSE;
                conn->idle_plus_waiting = FALSE;
                conn->idle_stopping = FALSE;
 
                conn->selecting_box = NULL;
                conn->selected_box = NULL;
-
-               i_free(conn->ips);
-               conn->ips_count = 0;
                break;
        default:
                break;
@@ -1830,8 +1829,9 @@ void imapc_connection_connect(struct imapc_connection *conn,
        dns_set.timeout_msecs = conn->client->set.connect_timeout_msecs;
 
        imapc_connection_set_state(conn, IMAPC_CONNECTION_STATE_CONNECTING);
-       if (conn->ips_count == 0 &&
-           net_addr2ip(conn->client->set.host, &ip) == 0) {
+       if (conn->ips_count > 0) {
+               /* do nothing */
+       } else if (net_addr2ip(conn->client->set.host, &ip) == 0) {
                conn->ips_count = 1;
                conn->ips = i_new(struct ip_addr, conn->ips_count);
                conn->ips[0] = ip;
@@ -1848,15 +1848,13 @@ void imapc_connection_connect(struct imapc_connection *conn,
                conn->ips_count = ips_count;
                conn->ips = i_new(struct ip_addr, ips_count);
                memcpy(conn->ips, ips, ips_count * sizeof(*ips));
-       }
-
-       if (conn->ips_count == 0) {
+       } else {
                (void)dns_lookup(conn->client->set.host, &dns_set,
                                 imapc_connection_dns_callback, conn,
                                 &conn->dns_lookup);
-       } else {
-               imapc_connection_connect_next_ip(conn);
+               return;
        }
+       imapc_connection_connect_next_ip(conn);
 }
 
 void imapc_connection_input_pending(struct imapc_connection *conn)