Use free_known_addresses() to free memory allocated by get_known_addresses().
We know what struct addrinfo looks like, but the standard says nothing about how it is allocated. So we cannot trust freeaddrinfo() to work correctly on the struct addrinfo list we allocated ourselves in get_known_addresses(). To make a distinction by allocations from the latter and from str2addrinfo(), we keep two pointers (*ai and *kai) in struct outgoing, and use the freeing function that is appropriate for each.
This commit is contained in:
parent
ef661316f1
commit
3fc678a8df
2 changed files with 20 additions and 4 deletions
|
@ -126,8 +126,9 @@ typedef struct outgoing_t {
|
||||||
int timeout;
|
int timeout;
|
||||||
splay_tree_t *config_tree;
|
splay_tree_t *config_tree;
|
||||||
struct config_t *cfg;
|
struct config_t *cfg;
|
||||||
struct addrinfo *ai;
|
struct addrinfo *ai; // addresses from config files
|
||||||
struct addrinfo *aip;
|
struct addrinfo *aip;
|
||||||
|
struct addrinfo *kai; // addresses known via other online nodes (use free_known_addresses())
|
||||||
timeout_t ev;
|
timeout_t ev;
|
||||||
} outgoing_t;
|
} outgoing_t;
|
||||||
|
|
||||||
|
|
|
@ -441,13 +441,20 @@ static void handle_meta_io(void *data, int flags) {
|
||||||
handle_meta_connection_data(c);
|
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) {
|
bool do_outgoing_connection(outgoing_t *outgoing) {
|
||||||
char *address, *port, *space;
|
char *address, *port, *space;
|
||||||
struct addrinfo *proxyai = NULL;
|
struct addrinfo *proxyai = NULL;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
begin:
|
begin:
|
||||||
if(!outgoing->ai) {
|
if(!outgoing->ai && !outgoing->kai) {
|
||||||
if(!outgoing->cfg) {
|
if(!outgoing->cfg) {
|
||||||
logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not set up a meta connection to %s", outgoing->name);
|
logger(DEBUG_CONNECTIONS, LOG_ERR, "Could not set up a meta connection to %s", outgoing->name);
|
||||||
retry_outgoing(outgoing);
|
retry_outgoing(outgoing);
|
||||||
|
@ -477,6 +484,11 @@ begin:
|
||||||
if(outgoing->ai)
|
if(outgoing->ai)
|
||||||
freeaddrinfo(outgoing->ai);
|
freeaddrinfo(outgoing->ai);
|
||||||
outgoing->ai = NULL;
|
outgoing->ai = NULL;
|
||||||
|
|
||||||
|
if(outgoing->kai)
|
||||||
|
free_known_addresses(outgoing->kai);
|
||||||
|
outgoing->kai = NULL;
|
||||||
|
|
||||||
goto begin;
|
goto begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,8 +633,8 @@ void setup_outgoing_connection(outgoing_t *outgoing) {
|
||||||
|
|
||||||
if(!outgoing->cfg) {
|
if(!outgoing->cfg) {
|
||||||
if(n)
|
if(n)
|
||||||
outgoing->aip = outgoing->ai = get_known_addresses(n);
|
outgoing->aip = outgoing->kai = get_known_addresses(n);
|
||||||
if(!outgoing->ai) {
|
if(!outgoing->kai) {
|
||||||
logger(DEBUG_ALWAYS, LOG_DEBUG, "No address known for %s", outgoing->name);
|
logger(DEBUG_ALWAYS, LOG_DEBUG, "No address known for %s", outgoing->name);
|
||||||
goto remove;
|
goto remove;
|
||||||
}
|
}
|
||||||
|
@ -777,6 +789,9 @@ static void free_outgoing(outgoing_t *outgoing) {
|
||||||
if(outgoing->ai)
|
if(outgoing->ai)
|
||||||
freeaddrinfo(outgoing->ai);
|
freeaddrinfo(outgoing->ai);
|
||||||
|
|
||||||
|
if(outgoing->kai)
|
||||||
|
free_known_addresses(outgoing->kai);
|
||||||
|
|
||||||
if(outgoing->config_tree)
|
if(outgoing->config_tree)
|
||||||
exit_configuration(&outgoing->config_tree);
|
exit_configuration(&outgoing->config_tree);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue