X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet.c;h=dbff75b9b1cfc95ced7c6522902ba5c9f17a5049;hb=1b30cee086148975886f961aadc26e23b1bfd6f2;hp=0e5823641de349b1bb2321623be9820e0a37891c;hpb=79e46d08a46f2fef2ee4e8eac7ba487007160564;p=tinc diff --git a/src/net.c b/src/net.c index 0e582364..dbff75b9 100644 --- a/src/net.c +++ b/src/net.c @@ -36,6 +36,9 @@ #include "subnet.h" #include "xalloc.h" +int contradicting_add_edge = 0; +int contradicting_del_edge = 0; + /* Purge edges and subnets of unreachable nodes. Use carefully. */ void purge(void) { @@ -189,10 +192,23 @@ static void timeout_handler(int fd, short events, void *event) { } } + if(contradicting_del_edge && contradicting_add_edge) { + logger(LOG_WARNING, "Possible node with same Name as us!"); + + if(rand() % 3 == 0) { + logger(LOG_ERR, "Shutting down, check configuration of all nodes for duplicate Names!"); + event_loopexit(NULL); + return; + } + + contradicting_add_edge = 0; + contradicting_del_edge = 0; + } + event_add(event, &(struct timeval){pingtimeout, 0}); } -void handle_meta_connection_data(int fd, short events, void *data) { +void handle_meta_connection_data(void *data) { connection_t *c = data; int result; socklen_t len = sizeof result; @@ -214,9 +230,11 @@ void handle_meta_connection_data(int fd, short events, void *data) { } } - if (!receive_meta(c)) { - terminate_connection(c, c->status.active); - return; + while(true) { + if (!receive_meta(c)) { + terminate_connection(c, c->status.active); + return; + } } } @@ -275,6 +293,7 @@ int reload_configuration(void) { if(strictsubnets) { subnet_t *subnet; + for(node = subnet_tree->head; node; node = node->next) { subnet = node->data; subnet->expires = 1;