--- channels/chan_sip.c 2011-08-15 22:07:11.000000000 +0200 +++ channels/chan_sip.c 2011-08-15 22:28:42.000000000 +0200 @@ -4649,6 +4649,7 @@ struct ast_variable *varregs = NULL; struct ast_variable *tmp; struct ast_config *peerlist = NULL; + int destroyvar = TRUE, destroyvarregs = TRUE; char ipaddr[INET6_ADDRSTRLEN]; char portstring[6]; /*up to 5 digits plus null terminator*/ int realtimeregs = ast_check_realtime("sipregs"); @@ -4693,6 +4694,10 @@ } if (!var && addr) { /* Then check on IP address for dynamic peers */ + if (varregs) { + ast_variables_destroy(varregs); + varregs = NULL; + } ast_copy_string(ipaddr, ast_sockaddr_stringify_addr(addr), sizeof(ipaddr)); ast_copy_string(portstring, ast_sockaddr_stringify_port(addr), sizeof(portstring)); var = ast_load_realtime("sippeers", "host", ipaddr, "port", portstring, SENTINEL); /* First check for fixed IP hosts */ @@ -4712,20 +4717,27 @@ } } if (!var) { /*We couldn't match on ipaddress and port, so we need to check if port is insecure*/ + if (varregs) { + ast_variables_destroy(varregs); + varregs = NULL; + } peerlist = ast_load_realtime_multientry("sippeers", "host", ipaddr, SENTINEL); if (peerlist) { var = get_insecure_variable_from_config(peerlist); if(var) { + destroyvar = FALSE; if (realtimeregs) { newpeername = get_name_from_variable(var, newpeername); varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL); } } else { /*var wasn't found in the list of "hosts", so try "ipaddr"*/ + ast_config_destroy(peerlist); peerlist = NULL; peerlist = ast_load_realtime_multientry("sippeers", "ipaddr", ipaddr, SENTINEL); if(peerlist) { var = get_insecure_variable_from_config(peerlist); if(var) { + destroyvar = FALSE; if (realtimeregs) { newpeername = get_name_from_variable(var, newpeername); varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL); @@ -4739,6 +4751,7 @@ if (peerlist) { varregs = get_insecure_variable_from_config(peerlist); if (varregs) { + destroyvarregs = FALSE; newpeername = get_name_from_variable(varregs, newpeername); var = ast_load_realtime("sippeers", "name", newpeername, SENTINEL); } @@ -4748,6 +4761,7 @@ if (peerlist) { var = get_insecure_variable_from_config(peerlist); if (var) { + destroyvar = FALSE; newpeername = get_name_from_variable(var, newpeername); varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL); } @@ -4767,8 +4781,11 @@ if (!strcasecmp(tmp->name, "type") && (!strcasecmp(tmp->value, "peer") && which_objects == FINDUSERS)) { if (peerlist) { ast_config_destroy(peerlist); - } else { + } + if (var && destroyvar) { ast_variables_destroy(var); + } + if (varregs && destroyvarregs) { ast_variables_destroy(varregs); } return NULL; @@ -4779,10 +4796,15 @@ if (!newpeername) { /* Did not find peer in realtime */ ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", ipaddr); - if(peerlist) + if(peerlist) { ast_config_destroy(peerlist); - else + } + if (var && destroyvar) { ast_variables_destroy(var); + } + if (varregs && destroyvarregs) { + ast_variables_destroy(varregs); + } return NULL; } @@ -4790,10 +4812,13 @@ /* Peer found in realtime, now build it in memory */ peer = build_peer(newpeername, var, varregs, TRUE, devstate_only); if (!peer) { - if(peerlist) + if(peerlist) { ast_config_destroy(peerlist); - else { + } + if (var && destroyvar) { ast_variables_destroy(var); + } + if (varregs && destroyvarregs) { ast_variables_destroy(varregs); } return NULL; @@ -4816,10 +4841,13 @@ } } peer->is_realtime = 1; - if (peerlist) + if (peerlist) { ast_config_destroy(peerlist); - else { + } + if (var && destroyvar) { ast_variables_destroy(var); + } + if (varregs && destroyvarregs) { ast_variables_destroy(varregs); }