From 60b36539ebef341c4b0be461e4837360c526a420 Mon Sep 17 00:00:00 2001 From: Travis Cross Date: Fri, 10 Oct 2014 18:25:11 +0000 Subject: [PATCH] Fix crash on transport=tls with non-TLS profile We use the transport of the Contact header of the remote UAC to decide which of our own Contact addresses we should use when replying to a SUBSCRIBE or sending a presence NOTIFY. If TLS is not enabled on a Sofia profile, then the TLS Contacts for that profile are NULL. Unfortunately we were using these NULL values uncritically when the remote UAC sent us a Contact header with a TLS transport and our own Sofia profile did not have TLS enabled. With this commit we fall back to our TCP Contact address when the remote Contact is TLS and our Sofia profile does not have TLS enabled. --- src/mod/endpoints/mod_sofia/sofia_glue.c | 3 ++- src/mod/endpoints/mod_sofia/sofia_presence.c | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index 55f948ce74..cd15913f5d 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -7008,7 +7008,8 @@ switch_status_t sofia_glue_send_notify(sofia_profile_t *profile, const char *use contact_str = profile->tcp_public_contact; break; case SOFIA_TRANSPORT_TCP_TLS: - contact_str = profile->tls_public_contact; + contact_str = sofia_test_pflag(profile, PFLAG_TLS) ? + profile->tls_public_contact : profile->tcp_public_contact; break; default: contact_str = profile->public_url; diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index b1bc009df5..95dfa521e6 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -2222,7 +2222,8 @@ static void _send_presence_notify(sofia_profile_t *profile, contact_str = profile->tcp_public_contact; break; case SOFIA_TRANSPORT_TCP_TLS: - contact_str = profile->tls_public_contact; + contact_str = sofia_test_pflag(profile, PFLAG_TLS) ? + profile->tls_public_contact : profile->tcp_public_contact; break; default: contact_str = profile->public_url; @@ -3919,9 +3920,11 @@ void sofia_presence_handle_sip_i_subscribe(int status, } } else if (switch_stristr("port=tls", contact->m_url->url_params)) { if (np.is_auto_nat) { - cs = profile->tls_public_contact; + cs = sofia_test_pflag(profile, PFLAG_TLS) ? + profile->tls_public_contact : profile->tcp_public_contact; } else { - cs = profile->tls_contact; + cs = sofia_test_pflag(profile, PFLAG_TLS) ? + profile->tls_contact : profile->tcp_contact; } }