Fix memory leak when updating subnet reachability.
[tinc] / src / net.c
index 3eec9a6..d80a712 100644 (file)
--- a/src/net.c
+++ b/src/net.c
@@ -199,7 +199,7 @@ static void timeout_handler(void *arg) {
 
                if(rand() % 3 == 0) {
                        logger(LOG_ERR, "Shutting down, check configuration of all nodes for duplicate Names!");
-                       abort();
+                       running = false;
                        return;
                }
 
@@ -216,13 +216,12 @@ void handle_meta_connection_data(void *data) {
        int result;
        socklen_t len = sizeof result;
 
-       if(c->status.connecting) {
-               c->status.connecting = false;
-
-               getsockopt(c->socket, SOL_SOCKET, SO_ERROR, &result, &len);
+       while(c->status.connecting) {
+               result = connect(c->socket, &c->address.sa, SALEN(c->address.sa));
 
                if(!result) {
                        mutex_lock(&mutex);
+                       c->status.connecting = false;
                        finish_connecting(c);
                        mutex_unlock(&mutex);
                } else {
@@ -230,10 +229,10 @@ void handle_meta_connection_data(void *data) {
                                           "Error while connecting to %s (%s): %s",
                                           c->name, c->hostname, sockstrerror(result));
                        closesocket(c->socket);
+                       c->status.connecting = false;
                        mutex_lock(&mutex);
                        do_outgoing_connection(c);
                        mutex_unlock(&mutex);
-                       return;
                }
        }
 
@@ -259,7 +258,7 @@ int reload_configuration(void) {
 
        if(!read_server_config()) {
                logger(LOG_ERR, "Unable to reread configuration file, exitting.");
-               abort();
+               running = false;
                return EINVAL;
        }
 
@@ -352,8 +351,7 @@ int main_loop(void) {
 
        event_add(&timeout_event);
 
-
-       while(true) {
+       while(running) {
                mutex_unlock(&mutex);
                usleep(1000000);
                mutex_lock(&mutex);