Fix crash is sptps_logger().
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 10 Jun 2015 21:42:17 +0000 (23:42 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 10 Jun 2015 21:42:17 +0000 (23:42 +0200)
Unfortunately, sptps_logger() cannot know if s->handle is pointing to a
connection_t or a node_t. But it needs to print name and hostname in
both cases. So make sure both types have name and hostname fields at the
start with the same offset.

src/connection.h
src/logger.c
src/node.h

index b41cf46a7425f43950921eeb76ce9a8e291d01fd..7fa769f8d784042edb85c319f31263146369e7bc 100644 (file)
@@ -59,9 +59,9 @@ typedef struct connection_status_t {
 
 typedef struct connection_t {
        char *name;                     /* name he claims to have */
+       char *hostname;                 /* the hostname of its real ip */
 
        union sockaddr_t address;       /* his real (internet) ip */
-       char *hostname;                 /* the hostname of its real ip */
        int protocol_major;             /* used protocol */
        int protocol_minor;             /* used protocol */
 
index ad7cef280c3d95cb210fcfd8e54920baa29e38d1..68a7fb2d0401207d1732e0dc29e1ddd50c3742af 100644 (file)
@@ -127,6 +127,8 @@ static void sptps_logger(sptps_t *s, int s_errno, const char *format, va_list ap
                if(message[len - 1] == '\n')
                        message[--len] = 0;
 
+               // WARNING: s->handle can point to a connection_t or a node_t,
+               // but both types have the name and hostname fields at the same offsets.
                connection_t *c = s->handle;
                if(c)
                        snprintf(message + len, sizeof message - len, " from %s (%s)", c->name, c->hostname);
index 0800337cf7dee4a910c179dfd4a1317d7e51c8f3..02e2a6d6ea42bc2fa57bbbe2a9ef3bc44001fa25 100644 (file)
@@ -45,12 +45,12 @@ typedef struct node_status_t {
 
 typedef struct node_t {
        char *name;                             /* name of this node */
+       char *hostname;                         /* the hostname of its real ip */
        node_id_t id;                           /* unique node ID (name hash) */
        uint32_t options;                       /* options turned on for this node */
 
        int sock;                               /* Socket to use for outgoing UDP packets */
        sockaddr_t address;                     /* his real (internet) ip to send UDP packets to */
-       char *hostname;                         /* the hostname of its real ip */
 
        node_status_t status;
        time_t last_state_change;