Fix segfault when Name = $HOST but $HOST is not set.
[tinc] / src / net_setup.c
index 5a7c606..e1d9f27 100644 (file)
@@ -295,17 +295,18 @@ char *get_name(void) {
 
        if(*name == '$') {
                char *envname = getenv(name + 1);
+               char hostname[32] = "";
                if(!envname) {
                        if(strcmp(name + 1, "HOST")) {
                                fprintf(stderr, "Invalid Name: environment variable %s does not exist\n", name + 1);
                                return false;
                        }
-                       char envname[32];
-                       if(gethostname(envname, 32)) {
+                       if(gethostname(hostname, sizeof hostname) || !*hostname) {
                                fprintf(stderr, "Could not get hostname: %s\n", strerror(errno));
                                return false;
                        }
-                       envname[31] = 0;
+                       hostname[31] = 0;
+                       envname = hostname;
                }
                free(name);
                name = xstrdup(envname);
@@ -334,7 +335,7 @@ static bool setup_myself(void) {
        char *address = NULL;
        char *proxy = NULL;
        char *space;
-       char *envp[5];
+       char *envp[5] = {NULL};
        struct addrinfo *ai, *aip, hint = {0};
        bool choice;
        int i, err;
@@ -692,11 +693,10 @@ static bool setup_myself(void) {
        xasprintf(&envp[1], "DEVICE=%s", device ? : "");
        xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
        xasprintf(&envp[3], "NAME=%s", myself->name);
-       envp[4] = NULL;
 
        execute_script("tinc-up", envp);
 
-       for(i = 0; i < 5; i++)
+       for(i = 0; i < 4; i++)
                free(envp[i]);
 
        /* Run subnet-up scripts for our own subnets */
@@ -862,7 +862,7 @@ bool setup_network(void) {
 void close_network_connections(void) {
        avl_node_t *node, *next;
        connection_t *c;
-       char *envp[5];
+       char *envp[5] = {NULL};
        int i;
 
        for(node = connection_tree->head; node; node = next) {
@@ -896,7 +896,6 @@ void close_network_connections(void) {
        xasprintf(&envp[1], "DEVICE=%s", device ? : "");
        xasprintf(&envp[2], "INTERFACE=%s", iface ? : "");
        xasprintf(&envp[3], "NAME=%s", myself->name);
-       envp[4] = NULL;
 
        exit_requests();
        exit_edges();