X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Faddress_cache.c;h=389615ea68bd3891c2939b89714cfe615a02eef3;hb=63fbaf7b4a33d5657cd3338b7ea91a173b9973fb;hp=552e1f2885a62c1fea7017ca92dde2b5b883b31a;hpb=04543a57e73e29c3e2a1968fd330f03c94dd6059;p=tinc diff --git a/src/address_cache.c b/src/address_cache.c index 552e1f28..389615ea 100644 --- a/src/address_cache.c +++ b/src/address_cache.c @@ -85,14 +85,16 @@ void add_recent_address(address_cache_t *cache, const sockaddr_t *sa) { unsigned int pos = find_cached(cache, sa); // It's in the first spot, so nothing to do - if (pos == 0) { + if(pos == 0) { return; } // Shift everything, move/add the address to the first slot if(pos == NOT_CACHED) { - if(cache->data.used < MAX_CACHED_ADDRESSES) + if(cache->data.used < MAX_CACHED_ADDRESSES) { cache->data.used++; + } + pos = cache->data.used - 1; } @@ -126,13 +128,13 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) { if(cache->ai) { if(cache->aip) { - sockaddr_t *sa = (sockaddr_t *)cache->aip; + sockaddr_t *sa = (sockaddr_t *)cache->aip->ai_addr; + cache->aip = cache->aip->ai_next; if(find_cached(cache, sa) != NOT_CACHED) { continue; } - cache->aip = cache->aip->ai_next; return sa; } else { free_known_addresses(cache->ai); @@ -167,22 +169,43 @@ const sockaddr_t *get_recent_address(address_cache_t *cache) { } cache->aip = cache->ai = str2addrinfo(address, port, SOCK_STREAM); + + if(cache->ai) { + struct addrinfo *ai = NULL; + + for(; cache->aip; cache->aip = cache->aip->ai_next) { + struct addrinfo *oai = ai; + + ai = xzalloc(sizeof(*ai)); + ai->ai_family = cache->aip->ai_family; + ai->ai_socktype = cache->aip->ai_socktype; + ai->ai_protocol = cache->aip->ai_protocol; + ai->ai_addrlen = cache->aip->ai_addrlen; + ai->ai_addr = xmalloc(ai->ai_addrlen); + memcpy(ai->ai_addr, cache->aip->ai_addr, ai->ai_addrlen); + ai->ai_next = oai; + } + + freeaddrinfo(cache->ai); + cache->aip = cache->ai = ai; + } + free(address); free(port); cache->cfg = lookup_config_next(cache->config_tree, cache->cfg); } - if(cache->aip) { - sockaddr_t *sa = (sockaddr_t *)cache->aip->ai_addr; - cache->aip = cache->aip->ai_next; + if(cache->ai) { + if(cache->aip) { + sockaddr_t *sa = (sockaddr_t *)cache->aip->ai_addr; - if(!cache->aip) { - freeaddrinfo(cache->aip); - cache->aip = NULL; + cache->aip = cache->aip->ai_next; + return sa; + } else { + free_known_addresses(cache->ai); + cache->ai = NULL; } - - return sa; } // We're all out of addresses. @@ -232,11 +255,7 @@ void reset_address_cache(address_cache_t *cache, const sockaddr_t *sa) { } if(cache->ai) { - if(cache->tried == cache->data.used) { - free_known_addresses(cache->ai); - } else { - freeaddrinfo(cache->ai); - } + free_known_addresses(cache->ai); } cache->config_tree = NULL; @@ -252,11 +271,7 @@ void close_address_cache(address_cache_t *cache) { } if(cache->ai) { - if(cache->tried == cache->data.used) { - free_known_addresses(cache->ai); - } else { - freeaddrinfo(cache->ai); - } + free_known_addresses(cache->ai); } free(cache);