Generate tinc-up.bat on windows
[tinc] / src / invitation.c
index d6f00a5..2976968 100644 (file)
@@ -181,6 +181,7 @@ char *get_my_hostname() {
        if(!tty) {
                if(!hostname) {
                        fprintf(stderr, "Could not determine the external address or hostname. Please set Address manually.\n");
+                       free(port);
                        return NULL;
                }
 
@@ -199,6 +200,7 @@ again:
        if(!fgets(line, sizeof(line), stdin)) {
                fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
                free(hostname);
+               free(port);
                return NULL;
        }
 
@@ -353,7 +355,11 @@ int cmd_invite(int argc, char *argv[]) {
 
                char invname[PATH_MAX];
                struct stat st;
-               snprintf(invname, sizeof(invname), "%s" SLASH "%s", filename, ent->d_name);
+
+               if((size_t)snprintf(invname, sizeof(invname), "%s" SLASH "%s", filename, ent->d_name) >= sizeof(invname)) {
+                       fprintf(stderr, "Filename too long: %s" SLASH "%s\n", filename, ent->d_name);
+                       continue;
+               }
 
                if(!stat(invname, &st)) {
                        if(deadline < st.st_mtime) {
@@ -414,8 +420,10 @@ int cmd_invite(int argc, char *argv[]) {
 
                fclose(f);
 
-               if(connect_tincd(false)) {
+               if(connect_tincd(true)) {
                        sendline(fd, "%d %d", CONTROL, REQ_RELOAD);
+               } else {
+                       fprintf(stderr, "Could not signal the tinc daemon. Please restart or reload it manually.\n");
                }
        } else {
                key = ecdsa_read_pem_private_key(f);
@@ -547,7 +555,7 @@ static char *get_line(const char **data) {
 
        static char line[1024];
        const char *end = strchr(*data, '\n');
-       size_t len = end ? end - *data : strlen(*data);
+       size_t len = end ? (size_t)(end - *data) : strlen(*data);
 
        if(len >= sizeof(line)) {
                fprintf(stderr, "Maximum line length exceeded!\n");
@@ -627,7 +635,7 @@ static char *grep(const char *data, const char *var) {
                return xstrdup(p);
        }
 
-       if(e - p >= sizeof(value)) {
+       if((size_t)(e - p) >= sizeof(value)) {
                fprintf(stderr, "Maximum line length exceeded!\n");
                return NULL;
        }
@@ -638,13 +646,18 @@ static char *grep(const char *data, const char *var) {
 }
 
 static bool finalize_join(void) {
-       char *name = xstrdup(get_value(data, "Name"));
+       const char *temp_name = get_value(data, "Name");
 
-       if(!name) {
+       if(!temp_name) {
                fprintf(stderr, "No Name found in invitation!\n");
                return false;
        }
 
+       size_t len = strlen(temp_name);
+       char name[len + 1];
+       memcpy(name, temp_name, len);
+       name[len] = 0;
+
        if(!check_id(name)) {
                fprintf(stderr, "Invalid Name found in invitation!\n");
                return false;
@@ -769,13 +782,19 @@ make_names:
 
                l[len] = 0;
 
+               // Ignore lines with empty variable names
+               if(!*l) {
+                       continue;
+               }
+
                // Is it a Name?
-               if(!strcasecmp(l, "Name"))
+               if(!strcasecmp(l, "Name")) {
                        if(strcmp(value, name)) {
                                break;
                        } else {
                                continue;
-                       } else if(!strcasecmp(l, "NetName")) {
+                       }
+               } else if(!strcasecmp(l, "NetName")) {
                        continue;
                }
 
@@ -817,8 +836,12 @@ make_names:
                        fprintf(stderr, "Ignoring unknown variable '%s' in invitation.\n", l);
                        continue;
                } else if(!(variables[i].type & VAR_SAFE)) {
-                       fprintf(stderr, "Ignoring unsafe variable '%s' in invitation.\n", l);
-                       continue;
+                       if(force) {
+                               fprintf(stderr, "Warning: unsafe variable '%s' in invitation.\n", l);
+                       } else {
+                               fprintf(stderr, "Ignoring unsafe variable '%s' in invitation.\n", l);
+                               continue;
+                       }
                }
 
                // Copy the safe variable to the right config file
@@ -947,7 +970,11 @@ ask_netname:
                line[strlen(line) - 1] = 0;
 
                char newbase[PATH_MAX];
-               snprintf(newbase, sizeof(newbase), CONFDIR SLASH "tinc" SLASH "%s", line);
+
+               if((size_t)snprintf(newbase, sizeof(newbase), CONFDIR SLASH "tinc" SLASH "%s", line) >= sizeof(newbase)) {
+                       fprintf(stderr, "Filename too long: " CONFDIR SLASH "tinc" SLASH "%s\n", line);
+                       goto ask_netname;
+               }
 
                if(rename(confbase, newbase)) {
                        fprintf(stderr, "Error trying to rename %s to %s: %s\n", confbase, newbase, strerror(errno));
@@ -960,7 +987,12 @@ ask_netname:
 
        char filename2[PATH_MAX];
        snprintf(filename, sizeof(filename), "%s" SLASH "tinc-up.invitation", confbase);
+
+#ifdef HAVE_MINGW
+       snprintf(filename2, sizeof(filename2), "%s" SLASH "tinc-up.bat", confbase);
+#else
        snprintf(filename2, sizeof(filename2), "%s" SLASH "tinc-up", confbase);
+#endif
 
        if(valid_tinc_up) {
                if(tty) {
@@ -989,7 +1021,17 @@ ask_netname:
                                if(response == 'e') {
                                        char *command;
 #ifndef HAVE_MINGW
-                                       xasprintf(&command, "\"%s\" \"%s\"", getenv("VISUAL") ? : getenv("EDITOR") ? : "vi", filename);
+                                       const char *editor = getenv("VISUAL");
+
+                                       if(!editor) {
+                                               editor = getenv("EDITOR");
+                                       }
+
+                                       if(!editor) {
+                                               editor = "vi";
+                                       }
+
+                                       xasprintf(&command, "\"%s\" \"%s\"", editor, filename);
 #else
                                        xasprintf(&command, "edit \"%s\"", filename);
 #endif
@@ -1026,7 +1068,11 @@ ask_netname:
 }
 
 
-static bool invitation_send(void *handle, uint8_t type, const void *data, size_t len) {
+static bool invitation_send(void *handle, uint8_t type, const void *vdata, size_t len) {
+       (void)handle;
+       (void)type;
+       const char *data = vdata;
+
        while(len) {
                int result = send(sock, data, len, 0);
 
@@ -1044,6 +1090,8 @@ static bool invitation_send(void *handle, uint8_t type, const void *data, size_t
 }
 
 static bool invitation_receive(void *handle, uint8_t type, const void *msg, uint16_t len) {
+       (void)handle;
+
        switch(type) {
        case SPTPS_HANDSHAKE:
                return sptps_send_record(&sptps, 0, cookie, sizeof(cookie));
@@ -1059,7 +1107,7 @@ static bool invitation_receive(void *handle, uint8_t type, const void *msg, uint
                return finalize_join();
 
        case 2:
-               fprintf(stderr, "Invitation succesfully accepted.\n");
+               fprintf(stderr, "Invitation successfully accepted.\n");
                shutdown(sock, SHUT_RDWR);
                success = true;
                break;
@@ -1195,6 +1243,7 @@ next:
                aip = aip->ai_next;
 
                if(!aip) {
+                       freeaddrinfo(ai);
                        return 1;
                }
        }
@@ -1221,7 +1270,7 @@ next:
        // Tell him we have an invitation, and give him our throw-away key.
        int len = snprintf(line, sizeof(line), "0 ?%s %d.%d\n", b64key, PROT_MAJOR, PROT_MINOR);
 
-       if(len <= 0 || len >= sizeof(line)) {
+       if(len <= 0 || (size_t)len >= sizeof(line)) {
                abort();
        }
 
@@ -1240,6 +1289,8 @@ next:
                goto next;
        }
 
+       freeaddrinfo(ai);
+
        // Check if the hash of the key he gave us matches the hash in the URL.
        char *fingerprint = line + 2;
        char hishash[64];