Convert Port to numeric form before sending it to other nodes.
authorGuus Sliepen <guus@tinc-vpn.org>
Sat, 3 Apr 2010 08:46:45 +0000 (09:46 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Sat, 3 Apr 2010 08:46:45 +0000 (09:46 +0100)
If one uses a symbolic name for the Port option, tinc will send that name
literally to other nodes.  However, it is not guaranteed that all nodes have
the same contents in /etc/services, or have such a file at all.

src/net_setup.c
src/netutl.c
src/protocol_auth.c

index 70291bffe97111f5f4a30691e63c56172a669351..813c58baca29fbf782a88d2133d9f01e00d72e4d 100644 (file)
@@ -309,6 +309,16 @@ bool setup_myself(void) {
                        && !get_config_string(lookup_config(myself->connection->config_tree, "Port"), &myport))
                myport = xstrdup("655");
 
+       if(!atoi(myport)) {
+               struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM);
+               sockaddr_t sa;
+               if(!ai || !ai->ai_addr)
+                       return false;
+               free(myport);
+               memcpy(&sa, ai->ai_addr, ai->ai_addrlen);
+               sockaddr2str(&sa, NULL, &myport);
+       }
+
        /* Read in all the subnets specified in the host configuration file */
 
        cfg = lookup_config(myself->connection->config_tree, "Subnet");
index b8ecdd1e9ea19b4c9b365ac3e847960cdea2cc3e..6acdffae7975a5864d623fbe2cf6c5864ebf4ce3 100644 (file)
@@ -102,8 +102,10 @@ void sockaddr2str(const sockaddr_t *sa, char **addrstr, char **portstr) {
        if(scopeid)
                *scopeid = '\0';                /* Descope. */
 
-       *addrstr = xstrdup(address);
-       *portstr = xstrdup(port);
+       if(addrstr)
+               *addrstr = xstrdup(address);
+       if(portstr)
+               *portstr = xstrdup(port);
 }
 
 char *sockaddr2hostname(const sockaddr_t *sa) {
index 06735dcf87c27e4db30a096dd1a27d5eb3586ffc..98d5b61dde4415db74e3c12a853489a99d8c5eea 100644 (file)
@@ -497,7 +497,7 @@ static void send_everything(connection_t *c) {
 
 bool ack_h(connection_t *c) {
        char hisport[MAX_STRING_SIZE];
-       char *hisaddress, *dummy;
+       char *hisaddress;
        int weight, mtu;
        uint32_t options;
        node_t *n;
@@ -566,10 +566,9 @@ bool ack_h(connection_t *c) {
        c->edge = new_edge();
        c->edge->from = myself;
        c->edge->to = n;
-       sockaddr2str(&c->address, &hisaddress, &dummy);
+       sockaddr2str(&c->address, &hisaddress, NULL);
        c->edge->address = str2sockaddr(hisaddress, hisport);
        free(hisaddress);
-       free(dummy);
        c->edge->weight = (weight + c->estimated_weight) / 2;
        c->edge->connection = c;
        c->edge->options = c->options;