From 604690b5c8093f476c05eaa95f71d48d71b130d1 Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Wed, 26 Dec 2018 15:51:41 -0500 Subject: [PATCH] FS-11583 [mod_sofia] fix crash when missing address in register event --- src/mod/endpoints/mod_sofia/sofia_glue.c | 3 +++ src/mod/endpoints/mod_sofia/sofia_reg.c | 24 +++++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index c01b27d1f4..d1431a1e57 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -510,6 +510,9 @@ int sofia_glue_transport_has_tls(const sofia_transport_t tp) void sofia_glue_get_addr(msg_t *msg, char *buf, size_t buflen, int *port) { su_addrinfo_t *addrinfo = msg_addrinfo(msg); + if (!addrinfo) { + return; + } if (buf) { get_addr(buf, buflen, addrinfo->ai_addr, (socklen_t)addrinfo->ai_addrlen); diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 39ae6b3b03..c8b358b8a9 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -151,8 +151,10 @@ void sofia_reg_fire_custom_gateway_state_event(sofia_gateway_t *gateway, int sta switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Gateway", gateway->name); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "State", sofia_state_string(gateway->state)); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Ping-Status", sofia_gateway_status_name(gateway->status)); - switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Register-Network-IP", gateway->register_network_ip); - switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "Register-Network-Port", "%d", gateway->register_network_port); + if (!zstr_buf(gateway->register_network_ip)) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Register-Network-IP", gateway->register_network_ip); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "Register-Network-Port", "%d", gateway->register_network_port); + } if (!zstr(phrase)) { switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Phrase", phrase); @@ -2406,13 +2408,17 @@ void sofia_reg_handle_sip_r_register(int status, if (sofia_private && gateway) { reg_state_t ostate = gateway->state; char oregister_network_ip[80] = { 0 }; - char network_ip[80]; + char network_ip[80] = { 0 }; - if (!zstr_buf(gateway->register_network_ip)) { - strncpy(oregister_network_ip, gateway->register_network_ip, sizeof(oregister_network_ip) - 1); + if (de && de->data && de->data->e_msg) { + if (!zstr_buf(gateway->register_network_ip)) { + strncpy(oregister_network_ip, gateway->register_network_ip, sizeof(oregister_network_ip) - 1); + } + sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &gateway->register_network_port); + if (!zstr_buf(network_ip)) { + snprintf(gateway->register_network_ip, sizeof(gateway->register_network_ip), (msg_addrinfo(de->data->e_msg))->ai_addr->sa_family == AF_INET6 ? "[%s]" : "%s", network_ip); + } } - sofia_glue_get_addr(de->data->e_msg, network_ip, sizeof(network_ip), &gateway->register_network_port); - snprintf(gateway->register_network_ip, sizeof(gateway->register_network_ip), (msg_addrinfo(de->data->e_msg))->ai_addr->sa_family == AF_INET6 ? "[%s]" : "%s", network_ip); switch (status) { case 200: @@ -2470,8 +2476,8 @@ void sofia_reg_handle_sip_r_register(int status, break; } if (ostate != gateway->state || - zstr_buf(oregister_network_ip) || strcmp(oregister_network_ip, gateway->register_network_ip)) { - + (!zstr_buf(gateway->register_network_ip) && + (zstr_buf(oregister_network_ip) || strcmp(oregister_network_ip, gateway->register_network_ip)))) { sofia_reg_fire_custom_gateway_state_event(gateway, status, phrase); } }