]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11583 [mod_sofia] fix crash when missing address in register event
authorChris Rienzo <chris@signalwire.com>
Wed, 26 Dec 2018 20:51:41 +0000 (15:51 -0500)
committerChris Rienzo <chris@signalwire.com>
Wed, 26 Dec 2018 20:51:41 +0000 (15:51 -0500)
src/mod/endpoints/mod_sofia/sofia_glue.c
src/mod/endpoints/mod_sofia/sofia_reg.c

index c01b27d1f4f4c6e5792c60845cb80742f3d8a69e..d1431a1e57f153f89a666903deb02fe2bf0c7e17 100644 (file)
@@ -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);
index 39ae6b3b03d7836b98b6f3a8406b12cd1b94efb2..c8b358b8a96fc719270bcfd27bcdb1a79d33c263 100644 (file)
@@ -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);
                }
        }