From e698e70cb7821ef766b1a85c509649d482d62cb8 Mon Sep 17 00:00:00 2001
From: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
Date: Fri, 2 Mar 2012 11:54:57 -0500
Subject: [PATCH] #8084: Fix get sip header segfault when stun transport
 selected

---
 daemon/src/sip/sipaccount.cpp  | 14 ++++++++++++--
 daemon/src/sip/sipvoiplink.cpp | 27 +++++++++++++++------------
 2 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp
index 8b96014a57..9cbb3c8d78 100644
--- a/daemon/src/sip/sipaccount.cpp
+++ b/daemon/src/sip/sipaccount.cpp
@@ -804,6 +804,16 @@ std::string SIPAccount::getContactHeader() const
 {
     std::string scheme;
     std::string transport;
+    pjsip_transport_type_e transportType = transportType_;
+    
+    if(transport_ == NULL) {
+        ERROR("Transport not created yet");
+    }
+
+    // The transport type must be specified, in our case START_OTHER refers to stun transport
+    if(transportType == PJSIP_TRANSPORT_START_OTHER) {
+        transportType = PJSIP_TRANSPORT_UDP;
+    }
 
     // Use the CONTACT header provided by the registrar if any
     if(!contactHeader_.empty())
@@ -811,12 +821,12 @@ std::string SIPAccount::getContactHeader() const
 
     // Else we determine this infor based on transport information
     std::string address, port;
-    link_->findLocalAddressFromTransport(transport_, transportType_, address, port);
+    link_->findLocalAddressFromTransport(transport_, transportType, address, port);
 
     // UDP does not require the transport specification
     if (transportType_ == PJSIP_TRANSPORT_TLS) {
         scheme = "sips:";
-        transport = ";transport=" + std::string(pjsip_transport_get_type_name(transportType_));
+        transport = ";transport=" + std::string(pjsip_transport_get_type_name(transportType));
     } else
         scheme = "sip:";
 
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index 21ea2c3253..6c329dde49 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -88,7 +88,7 @@ static std::map<std::string, std::string> transferCallID;
  * localport, localip, localexternalport
  * @param call a SIPCall valid pointer
  */
-void setCallMediaLocal(SIPCall* call, const std::string &localIP);
+static void setCallMediaLocal(SIPCall* call, const std::string &localIP);
 
 /**
  * Helper function to parser header from incoming sip messages
@@ -101,17 +101,17 @@ static pjsip_endpoint *endpt_;
 static pjsip_module mod_ua_;
 static pj_thread_t *thread;
 
-void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status UNUSED);
-void sdp_request_offer_cb(pjsip_inv_session *inv, const pjmedia_sdp_session *offer);
-void sdp_create_offer_cb(pjsip_inv_session *inv, pjmedia_sdp_session **p_offer);
-void invite_session_state_changed_cb(pjsip_inv_session *inv, pjsip_event *e);
-void outgoing_request_forked_cb(pjsip_inv_session *inv, pjsip_event *e);
-void transaction_state_changed_cb(pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_event *e);
-void registration_cb(pjsip_regc_cbparam *param);
-pj_bool_t transaction_request_cb(pjsip_rx_data *rdata);
-pj_bool_t transaction_response_cb(pjsip_rx_data *rdata UNUSED) ;
+static void sdp_media_update_cb(pjsip_inv_session *inv, pj_status_t status UNUSED);
+static void sdp_request_offer_cb(pjsip_inv_session *inv, const pjmedia_sdp_session *offer);
+static void sdp_create_offer_cb(pjsip_inv_session *inv, pjmedia_sdp_session **p_offer);
+static void invite_session_state_changed_cb(pjsip_inv_session *inv, pjsip_event *e);
+static void outgoing_request_forked_cb(pjsip_inv_session *inv, pjsip_event *e);
+static void transaction_state_changed_cb(pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_event *e);
+static void registration_cb(pjsip_regc_cbparam *param);
+static pj_bool_t transaction_request_cb(pjsip_rx_data *rdata);
+static pj_bool_t transaction_response_cb(pjsip_rx_data *rdata UNUSED) ;
 
-void transfer_client_cb(pjsip_evsub *sub, pjsip_event *event);
+static void transfer_client_cb(pjsip_evsub *sub, pjsip_event *event);
 
 /**
  * Send a reINVITE inside an active dialog to modify its state
@@ -1470,7 +1470,9 @@ pjsip_tpselector *SIPVoIPLink::initTransportSelector(pjsip_transport *transport,
 void SIPVoIPLink::createStunTransport(SIPAccount *account)
 {
     pj_str_t stunServer = account->getStunServerName();
-    pj_uint16_t stunPort = account->getStunPort();
+    pj_uint16_t stunPort = PJ_STUN_PORT; // account->getStunPort();
+
+    DEBUG("UserAgent: Create stun transport  server name: %s, port: %d", account->getStunServerName(), stunPort);// account->getStunPort());
 
     if (stunServerResolve(account) != PJ_SUCCESS) {
         ERROR("Can't resolve STUN server");
@@ -1561,6 +1563,7 @@ void SIPVoIPLink::findLocalAddressFromTransport(pjsip_transport *transport, pjsi
     int i_port = 0;
 
     // Find the local address and port for this transport
+    DEBUG("transportType: %d\n", transportType);
     if (pjsip_tpmgr_find_local_addr(tpmgr, pool_, transportType, tp_sel, &localAddress, &i_port) != PJ_SUCCESS) {
         WARN("SIPVoIPLink: Could not retreive local address and port from transport, using %s:%s", addr.c_str(), port.c_str());
         return;
-- 
GitLab