Add missing cleanup functions in close_network_connections().
[tinc] / src / net_setup.c
index 4bac3f0..f52afb0 100644 (file)
@@ -1,7 +1,7 @@
 /*
     net_setup.c -- Setup.
     Copyright (C) 1998-2005 Ivo Timmermans,
-                  2000-2006 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2008 Guus Sliepen <guus@tinc-vpn.org>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -286,7 +286,7 @@ bool setup_myself(void)
        if(get_config_bool(lookup_config(myself->connection->config_tree, "TCPOnly"), &choice) && choice)
                myself->options |= OPTION_TCPONLY;
 
-       if(get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) && choice)
+       if(!get_config_bool(lookup_config(myself->connection->config_tree, "PMTUDiscovery"), &choice) || choice)
                myself->options |= OPTION_PMTU_DISCOVERY;
 
        if(myself->options & OPTION_TCPONLY)
@@ -526,11 +526,11 @@ bool setup_network_connections(void)
 
        now = time(NULL);
 
+       init_events();
        init_connections();
        init_subnets();
        init_nodes();
        init_edges();
-       init_events();
        init_requests();
 
        if(get_config_int(lookup_config(config_tree, "PingInterval"), &pinginterval)) {
@@ -572,14 +572,21 @@ void close_network_connections(void)
                next = node->next;
                c = node->data;
 
-               if(c->outgoing)
-                       free(c->outgoing->name), free(c->outgoing), c->outgoing = NULL;
+               if(c->outgoing) {
+                       if(c->outgoing->ai)
+                               freeaddrinfo(c->outgoing->ai);
+                       free(c->outgoing->name);
+                       free(c->outgoing);
+                       c->outgoing = NULL;
+               }
+
                terminate_connection(c, false);
        }
 
        if(myself && myself->connection) {
                subnet_update(myself, NULL, false);
                terminate_connection(myself->connection, false);
+               free_connection(myself->connection);
        }
 
        for(i = 0; i < listen_sockets; i++) {
@@ -594,14 +601,18 @@ void close_network_connections(void)
        envp[4] = NULL;
 
        exit_requests();
-       exit_events();
        exit_edges();
        exit_subnets();
        exit_nodes();
        exit_connections();
+       exit_events();
 
        execute_script("tinc-down", envp);
 
+       if(myport) free(myport);
+
+       EVP_CIPHER_CTX_cleanup(&packet_ctx);
+
        for(i = 0; i < 4; i++)
                free(envp[i]);