Fix a few minor memory leaks.
[tinc] / src / tincd.c
index ccd79dc..98a9a64 100644 (file)
@@ -1,7 +1,7 @@
 /*
     tincd.c -- the main file for tincd
     Copyright (C) 1998-2005 Ivo Timmermans
-                  2000-2016 Guus Sliepen <guus@tinc-vpn.org>
+                  2000-2017 Guus Sliepen <guus@tinc-vpn.org>
                   2008      Max Rijevski <maksuf@gmail.com>
                   2009      Michael Tokarev <mjt@tls.msk.ru>
                   2010      Julien Muchembled <jm@jmuchemb.eu>
@@ -390,7 +390,7 @@ static bool keygen(int bits) {
        BIGNUM *e = NULL;
        RSA *rsa_key;
        FILE *f;
-       char *pubname, *privname;
+       char filename[PATH_MAX];
        BN_GENCB *cb;
        int result;
 
@@ -411,18 +411,20 @@ static bool keygen(int bits) {
        BN_free(e);
        BN_GENCB_free(cb);
 
-       if(!rsa_key) {
+       if(!result) {
                fprintf(stderr, "Error during key generation!\n");
+               RSA_free(rsa_key);
                return false;
        } else
                fprintf(stderr, "Done.\n");
 
-       xasprintf(&privname, "%s/rsa_key.priv", confbase);
-       f = ask_and_open(privname, "private RSA key");
-       free(privname);
+       snprintf(filename, sizeof filename, "%s/rsa_key.priv", confbase);
+       f = ask_and_open(filename, "private RSA key");
 
-       if(!f)
+       if(!f) {
+               RSA_free(rsa_key);
                return false;
+       }
 
 #ifdef HAVE_FCHMOD
        /* Make it unreadable for others. */
@@ -436,22 +438,25 @@ static bool keygen(int bits) {
        char *name = get_name();
 
        if(name) {
-               xasprintf(&pubname, "%s/hosts/%s", confbase, name);
+               snprintf(filename, sizeof filename, "%s/hosts/%s", confbase, name);
                free(name);
        } else {
-               xasprintf(&pubname, "%s/rsa_key.pub", confbase);
+               snprintf(filename, sizeof filename, "%s/rsa_key.pub", confbase);
        }
 
-       f = ask_and_open(pubname, "public RSA key");
-       free(pubname);
+       f = ask_and_open(filename, "public RSA key");
 
-       if(!f)
+       if(!f) {
+               RSA_free(rsa_key);
                return false;
+       }
 
        fputc('\n', f);
        PEM_write_RSAPublicKey(f, rsa_key);
        fclose(f);
 
+       RSA_free(rsa_key);
+
        return true;
 }
 
@@ -583,7 +588,7 @@ int main(int argc, char **argv) {
 
        if(show_version) {
                printf("%s version %s\n", PACKAGE, VERSION);
-               printf("Copyright (C) 1998-2016 Ivo Timmermans, Guus Sliepen and others.\n"
+               printf("Copyright (C) 1998-2017 Ivo Timmermans, Guus Sliepen and others.\n"
                                "See the AUTHORS file for a complete list.\n\n"
                                "tinc comes with ABSOLUTELY NO WARRANTY.  This is free software,\n"
                                "and you are welcome to redistribute it under certain conditions;\n"
@@ -739,7 +744,7 @@ end:
        ERR_free_strings();
 
        exit_configuration(&config_tree);
-       list_free(cmdline_conf);
+       list_delete_list(cmdline_conf);
        free_names();
 
        return status;