X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnet_socket.c;h=ac6b8402248b822f0800807b4199f4fa3a615d3e;hp=36ea5fed492ba3b44f06fa73b0374243470bb5b6;hb=af81c436d6e11a53803747af7cc8ecfd449ccd4c;hpb=ef661316f163f2ecf6c75a3dd28e2cad51772c56 diff --git a/src/net_socket.c b/src/net_socket.c index 36ea5fed..ac6b8402 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -1,7 +1,7 @@ /* net_socket.c -- Handle various kinds of sockets. Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2016 Guus Sliepen + 2000-2017 Guus Sliepen 2006 Scott Lamb 2009 Florian Forster @@ -382,7 +382,7 @@ static void handle_meta_write(connection_t *c) { if(!sockerrno || sockerrno == EPIPE) { logger(DEBUG_CONNECTIONS, LOG_NOTICE, "Connection closed by %s (%s)", c->name, c->hostname); } else if(sockwouldblock(sockerrno)) { - logger(DEBUG_CONNECTIONS, LOG_DEBUG, "Sending %d bytes to %s (%s) would block", c->outbuf.len - c->outbuf.offset, c->name, c->hostname); + logger(DEBUG_META, LOG_DEBUG, "Sending %d bytes to %s (%s) would block", c->outbuf.len - c->outbuf.offset, c->name, c->hostname); return; } else { logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not send %d bytes of data to %s (%s): %s", c->outbuf.len - c->outbuf.offset, c->name, c->hostname, sockstrerror(sockerrno)); @@ -441,13 +441,20 @@ static void handle_meta_io(void *data, int flags) { handle_meta_connection_data(c); } +static void free_known_addresses(struct addrinfo *ai) { + for(struct addrinfo *aip = ai, *next; aip; aip = next) { + next = aip->ai_next; + free(aip); + } +} + bool do_outgoing_connection(outgoing_t *outgoing) { char *address, *port, *space; struct addrinfo *proxyai = NULL; int result; begin: - if(!outgoing->ai) { + if(!outgoing->ai && !outgoing->kai) { if(!outgoing->cfg) { logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not set up a meta connection to %s", outgoing->name); retry_outgoing(outgoing); @@ -477,6 +484,11 @@ begin: if(outgoing->ai) freeaddrinfo(outgoing->ai); outgoing->ai = NULL; + + if(outgoing->kai) + free_known_addresses(outgoing->kai); + outgoing->kai = NULL; + goto begin; } @@ -621,8 +633,8 @@ void setup_outgoing_connection(outgoing_t *outgoing) { if(!outgoing->cfg) { if(n) - outgoing->aip = outgoing->ai = get_known_addresses(n); - if(!outgoing->ai) { + outgoing->aip = outgoing->kai = get_known_addresses(n); + if(!outgoing->kai) { logger(DEBUG_ALWAYS, LOG_DEBUG, "No address known for %s", outgoing->name); goto remove; } @@ -777,6 +789,9 @@ static void free_outgoing(outgoing_t *outgoing) { if(outgoing->ai) freeaddrinfo(outgoing->ai); + if(outgoing->kai) + free_known_addresses(outgoing->kai); + if(outgoing->config_tree) exit_configuration(&outgoing->config_tree);