Do not break strict aliasing of status_t structs.
This commit is contained in:
		
							parent
							
								
									2077451e07
								
							
						
					
					
						commit
						eb391c52ee
					
				
					 4 changed files with 28 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -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);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										19
									
								
								src/node.h
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue