From 8f6e9ac3d0a2486a872faf1b637ff2f9d6226c26 Mon Sep 17 00:00:00 2001
From: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
Date: Tue, 24 Apr 2012 12:26:42 -0400
Subject: [PATCH] #9910: fix sending call with new transport

---
 daemon/src/sip/sipaccount.cpp   |  2 +-
 daemon/src/sip/siptransport.cpp |  2 +-
 daemon/src/sip/sipvoiplink.cpp  | 16 +++++++++++-----
 3 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp
index 1fce8c82e4..031bda7cbf 100644
--- a/daemon/src/sip/sipaccount.cpp
+++ b/daemon/src/sip/sipaccount.cpp
@@ -793,7 +793,7 @@ void SIPAccount::setContactHeader(std::string address, std::string port)
 std::string SIPAccount::getContactHeader() const
 {
     if (transport_ == NULL)
-        ERROR("Transport not created yet");
+        ERROR("SipAccount: Transport not created yet");
 
     // The transport type must be specified, in our case START_OTHER refers to stun transport
     pjsip_transport_type_e transportType = transportType_;
diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp
index e1f10dadcd..7765a81b8b 100644
--- a/daemon/src/sip/siptransport.cpp
+++ b/daemon/src/sip/siptransport.cpp
@@ -457,7 +457,7 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port
 {
     // init socket to bind this transport to
     pj_uint16_t listeningPort = (pj_uint16_t) port;
-    pjsip_transport *transport;
+    pjsip_transport *transport = NULL;
 
     DEBUG("SipTransport: Update UDP transport on %s:%d with public addr %s:%d", interface.c_str(), port, publicAddr.c_str(), publicPort);
 
diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp
index 9dce39431a..c8773ca594 100644
--- a/daemon/src/sip/sipvoiplink.cpp
+++ b/daemon/src/sip/sipvoiplink.cpp
@@ -524,6 +524,9 @@ void SIPVoIPLink::sendRegister(Account *a)
         account->setReceivedParameter("");
         // Explicitely set the bound address port to 0 so that pjsip determine a random port by itself
         account->transport_= sipTransport.createUdpTransport(account->getLocalInterface(), 0, received, account->getLocalPort());
+        if(account->transport_ == NULL) {
+            ERROR("UserAgent: Could not create new udp transport with public address: %s:%d", received.c_str(), account->getLocalPort());
+        }
     }
 
     if (pjsip_regc_init(regc, &pjSrv, &pjFrom, &pjFrom, 1, &pjContact, account->getRegistrationExpire()) != PJ_SUCCESS)
@@ -1617,7 +1620,6 @@ void registration_cb(pjsip_regc_cbparam *param)
     if (param->status != PJ_SUCCESS) {
         account->setRegistrationState(ErrorAuth);
         account->setRegister(false);
-
         SIPVoIPLink::instance()->sipTransport.shutdownSipTransport(*account);
         return;
     }
@@ -1633,29 +1635,33 @@ void registration_cb(pjsip_regc_cbparam *param)
             case PJSIP_SC_SERVICE_UNAVAILABLE:
             case PJSIP_SC_REQUEST_TIMEOUT:
                 account->setRegistrationState(ErrorHost);
+                account->setRegister(false);
+                SIPVoIPLink::instance()->sipTransport.shutdownSipTransport(*account);
                 break;
 
             case PJSIP_SC_UNAUTHORIZED:
             case PJSIP_SC_FORBIDDEN:
             case PJSIP_SC_NOT_FOUND:
                 account->setRegistrationState(ErrorAuth);
+                account->setRegister(false);
+                SIPVoIPLink::instance()->sipTransport.shutdownSipTransport(*account);
                 break;
 
             case PJSIP_SC_INTERVAL_TOO_BRIEF:
                 // Expiration Interval Too Brief
                 account->doubleRegistrationExpire();
                 account->registerVoIPLink();
+                account->setRegister(false);
+                SIPVoIPLink::instance()->sipTransport.shutdownSipTransport(*account);
                 break;
 
             default:
                 account->setRegistrationState(Error);
+                account->setRegister(false);
+                SIPVoIPLink::instance()->sipTransport.shutdownSipTransport(*account);
                 break;
         }
 
-        account->setRegister(false);
-
-        SIPVoIPLink::instance()->sipTransport.shutdownSipTransport(*account);
-
     } else {
         if (account->isRegistered())
             account->setRegistrationState(Registered);
-- 
GitLab