Validate Name before using it in a filename when generating a keypair.
[tinc] / src / tincd.c
index 746fff4..5fedd69 100644 (file)
@@ -292,6 +292,18 @@ static bool keygen(int bits)
        char *name = NULL;
        char *filename;
 
+       get_config_string(lookup_config(config_tree, "Name"), &name);
+
+       if(name) {
+               if(!check_id(name)) {
+                       fprintf(stderr, _("Invalid name for myself!\n"));
+                       return false;
+               }
+               asprintf(&filename, "%s/hosts/%s", confbase, name);
+               free(name);
+       } else
+               asprintf(&filename, "%s/rsa_key.pub", confbase);
+
        fprintf(stderr, _("Generating %d bits keys:\n"), bits);
        rsa_key = RSA_generate_key(bits, 0x10001, indicator, NULL);
 
@@ -319,13 +331,6 @@ static bool keygen(int bits)
        fclose(f);
        free(filename);
 
-       get_config_string(lookup_config(config_tree, "Name"), &name);
-
-       if(name)
-               asprintf(&filename, "%s/hosts/%s", confbase, name);
-       else
-               asprintf(&filename, "%s/rsa_key.pub", confbase);
-
        f = ask_and_open(filename, _("public RSA key"), "a");
 
        if(!f)
@@ -392,6 +397,14 @@ static void make_names(void)
        }
 }
 
+static void free_names() {
+       if (identname) free(identname);
+       if (netname) free(netname);
+       if (pidfilename) free(pidfilename);
+       if (logfilename) free(logfilename);
+       if (confbase) free(confbase);
+}
+
 int main(int argc, char **argv)
 {
        program_name = argv[0];
@@ -498,11 +511,11 @@ int main2(int argc, char **argv)
 
        /* Shutdown properly. */
 
-       close_network_connections();
-
        ifdebug(CONNECTIONS)
                dump_device_stats();
 
+       close_network_connections();
+
 end:
        logger(LOG_NOTICE, _("Terminating"));
 
@@ -510,20 +523,14 @@ end:
        remove_pid(pidfilename);
 #endif
 
-       if (identname) free(identname);
-       if (netname) free(netname);
-       if (pidfilename) free(pidfilename);
-       if (logfilename) free(logfilename);
-       if (myport) free(myport);
-       if (device) free(device);
-       if (iface) free(iface);
-       if (confbase) free(confbase);
-
        EVP_cleanup();
        ENGINE_cleanup();
        CRYPTO_cleanup_all_ex_data();
        ERR_remove_state(0);
        ERR_free_strings();
+
+       exit_configuration(&config_tree);
+       free_names();
        
        return status;
 }