Fix memory leaks found by Valgrind.
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 24 Dec 2014 16:31:33 +0000 (17:31 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 24 Dec 2014 16:31:33 +0000 (17:31 +0100)
src/net_setup.c
src/openssl/crypto.c
src/subnet.c

index 0a99daad5ec9bc9406e5f5f7802e85d0ba148a29..a7ed3a8995750b45ece4fe82f437fbd2bbe5bcf9 100644 (file)
@@ -1114,7 +1114,7 @@ void close_network_connections(void) {
        if (!device_standby)
                device_disable();
 
-       if(myport) free(myport);
+       free(myport);
 
        if (device_fd >= 0)
                io_del(&device_io);
@@ -1124,7 +1124,8 @@ void close_network_connections(void) {
        exit_control();
 
        free(myname);
-       myname = NULL;
+       free(scriptextension);
+       free(scriptinterpreter);
 
        return;
 }
index ed8c8e296c6d37998505eafb906773cacc87564a..5b866b0b0293c34c8198872f51fa4bbb59b80977 100644 (file)
@@ -99,5 +99,7 @@ void crypto_init(void) {
 
 void crypto_exit(void) {
        EVP_cleanup();
+       ERR_free_strings();
+       ENGINE_cleanup();
        random_exit();
 }
index 5356f3a77c02430bb6fd57b04e196e9ae51f1882..534e5b53d562a9f8ae3f820c406622b65143f13b 100644 (file)
@@ -207,21 +207,21 @@ void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
        // Prepare environment variables to be passed to the script
 
        char *envp[10] = {NULL};
-       xasprintf(&envp[0], "NETNAME=%s", netname ? : "");
-       xasprintf(&envp[1], "DEVICE=%s", device ? : "");
-       xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
-       xasprintf(&envp[3], "NODE=%s", owner->name);
+       int n = 0;
+       xasprintf(&envp[n++], "NETNAME=%s", netname ? : "");
+       xasprintf(&envp[n++], "DEVICE=%s", device ? : "");
+       xasprintf(&envp[n++], "INTERFACE=%s", iface ? : "");
+       xasprintf(&envp[n++], "NODE=%s", owner->name);
 
        if(owner != myself) {
                sockaddr2str(&owner->address, &address, &port);
-               // 4 and 5 are reserved for SUBNET and WEIGHT
-               xasprintf(&envp[6], "REMOTEADDRESS=%s", address);
-               xasprintf(&envp[7], "REMOTEPORT=%s", port);
+               xasprintf(&envp[n++], "REMOTEADDRESS=%s", address);
+               xasprintf(&envp[n++], "REMOTEPORT=%s", port);
                free(port);
                free(address);
        }
 
-       xasprintf(&envp[8], "NAME=%s", myself->name);
+       xasprintf(&envp[n++], "NAME=%s", myself->name);
 
        name = up ? "subnet-up" : "subnet-down";
 
@@ -238,12 +238,10 @@ void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
                                weight = empty;
 
                        // Prepare the SUBNET and WEIGHT variables
-                       if(envp[4])
-                               free(envp[4]);
-                       if(envp[5])
-                               free(envp[5]);
-                       xasprintf(&envp[4], "SUBNET=%s", netstr);
-                       xasprintf(&envp[5], "WEIGHT=%s", weight);
+                       free(envp[n]);
+                       free(envp[n + 1]);
+                       xasprintf(&envp[n], "SUBNET=%s", netstr);
+                       xasprintf(&envp[n + 1], "WEIGHT=%s", weight);
 
                        execute_script(name, envp);
                }
@@ -257,8 +255,8 @@ void subnet_update(node_t *owner, subnet_t *subnet, bool up) {
                                weight = empty;
 
                        // Prepare the SUBNET and WEIGHT variables
-                       xasprintf(&envp[4], "SUBNET=%s", netstr);
-                       xasprintf(&envp[5], "WEIGHT=%s", weight);
+                       xasprintf(&envp[n], "SUBNET=%s", netstr);
+                       xasprintf(&envp[n + 1], "WEIGHT=%s", weight);
 
                        execute_script(name, envp);
                }