From eb391c52eed46f3f03b404553df417851fc0cb90 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Tue, 8 Aug 2006 13:21:08 +0000 Subject: [PATCH] Do not break strict aliasing of status_t structs. --- src/connection.c | 2 +- src/connection.h | 27 +++++++++++++++------------ src/net.c | 2 +- src/node.h | 19 +++++++++++-------- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/connection.c b/src/connection.c index c1a1b69f..c4c9fd48 100644 --- a/src/connection.c +++ b/src/connection.c @@ -122,7 +122,7 @@ void dump_connections(void) for(node = connection_tree->head; node; node = node->next) { c = node->data; logger(LOG_DEBUG, _(" %s at %s options %lx socket %d status %04x outbuf %d/%d/%d"), - c->name, c->hostname, c->options, c->socket, *(uint32_t *)&c->status, + c->name, c->hostname, c->options, c->socket, c->status.value, c->outbufsize, c->outbufstart, c->outbuflen); } diff --git a/src/connection.h b/src/connection.h index 87988db4..087d8f00 100644 --- a/src/connection.h +++ b/src/connection.h @@ -32,17 +32,20 @@ #define OPTION_TCPONLY 0x0002 #define OPTION_PMTU_DISCOVERY 0x0004 -typedef struct connection_status_t { - int pinged:1; /* sent ping */ - int active:1; /* 1 if active.. */ - int connecting:1; /* 1 if we are waiting for a non-blocking connect() to finish */ - int termreq:1; /* the termination of this connection was requested */ - int remove:1; /* Set to 1 if you want this connection removed */ - int timeout:1; /* 1 if gotten timeout */ - int encryptout:1; /* 1 if we can encrypt outgoing traffic */ - int decryptin:1; /* 1 if we have to decrypt incoming traffic */ - int mst:1; /* 1 if this connection is part of a minimum spanning tree */ - int unused:23; +typedef union connection_status_t { + struct { + int pinged:1; /* sent ping */ + int active:1; /* 1 if active.. */ + int connecting:1; /* 1 if we are waiting for a non-blocking connect() to finish */ + int termreq:1; /* the termination of this connection was requested */ + int remove:1; /* Set to 1 if you want this connection removed */ + int timeout:1; /* 1 if gotten timeout */ + int encryptout:1; /* 1 if we can encrypt outgoing traffic */ + int decryptin:1; /* 1 if we have to decrypt incoming traffic */ + int mst:1; /* 1 if this connection is part of a minimum spanning tree */ + int unused:23; + }; + uint32_t value; } connection_status_t; #include "edge.h" @@ -59,7 +62,7 @@ typedef struct connection_t { int socket; /* socket used for this connection */ long int options; /* options for this connection */ - struct connection_status_t status; /* status info */ + connection_status_t status; /* status info */ int estimated_weight; /* estimation for the weight of the edge for this connection */ struct timeval start; /* time this connection was started, used for above estimation */ struct outgoing_t *outgoing; /* used to keep track of outgoing connections */ diff --git a/src/net.c b/src/net.c index e40caefd..144655fb 100644 --- a/src/net.c +++ b/src/net.c @@ -251,7 +251,7 @@ static void check_dead_connections(void) } else { if(c->status.remove) { logger(LOG_WARNING, _("Old connection_t for %s (%s) status %04x still lingering, deleting..."), - c->name, c->hostname, *(uint32_t *)&c->status); + c->name, c->hostname, c->status.value); connection_del(c); continue; } diff --git a/src/node.h b/src/node.h index 9c49a799..2ea96922 100644 --- a/src/node.h +++ b/src/node.h @@ -29,14 +29,17 @@ #include "list.h" #include "subnet.h" -typedef struct node_status_t { - int active:1; /* 1 if active.. */ - int validkey:1; /* 1 if we currently have a valid key for him */ - int waitingforkey:1; /* 1 if we already sent out a request */ - int visited:1; /* 1 if this node has been visited by one of the graph algorithms */ - int reachable:1; /* 1 if this node is reachable in the graph */ - int indirect:1; /* 1 if this node is not directly reachable by us */ - int unused:26; +typedef union node_status_t { + struct { + int active:1; /* 1 if active.. */ + int validkey:1; /* 1 if we currently have a valid key for him */ + int waitingforkey:1; /* 1 if we already sent out a request */ + int visited:1; /* 1 if this node has been visited by one of the graph algorithms */ + int reachable:1; /* 1 if this node is reachable in the graph */ + int indirect:1; /* 1 if this node is not directly reachable by us */ + int unused:26; + }; + uint32_t value; } node_status_t; typedef struct node_t { -- 2.20.1