Module: sems
Branch: master
Commit: 4960be4d5363b3e7e2139e57638a3b7d99e24bbb
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=4960be4d5363b3e7e2139e57638a3b7d99e24bbb

Author: Raphael Coeffic <[email protected]>
Committer: Stefan Sayer <[email protected]>
Date:   Wed Apr  2 11:53:38 2014 +0200

core: b/f: do not re-use the uac transaction iterator after onRxReplyStatus()

The transaction could possibly have been deleted in between, whereby it is 
unclear where.

---

 core/AmBasicSipDialog.cpp |   12 +++++++-----
 core/AmBasicSipDialog.h   |    3 +--
 core/AmSipDialog.cpp      |    3 +--
 core/AmSipDialog.h        |    2 +-
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/core/AmBasicSipDialog.cpp b/core/AmBasicSipDialog.cpp
index f2a8e47..ac37157 100644
--- a/core/AmBasicSipDialog.cpp
+++ b/core/AmBasicSipDialog.cpp
@@ -358,8 +358,7 @@ void AmBasicSipDialog::onRxRequest(const AmSipRequest& req)
     hdl->onSipRequest(req);
 }
 
-bool AmBasicSipDialog::onRxReplyStatus(const AmSipReply& reply, 
-                                      TransMap::iterator t_uac_it)
+bool AmBasicSipDialog::onRxReplyStatus(const AmSipReply& reply)
 {
   /**
    * Error code list from RFC 5057:
@@ -448,15 +447,18 @@ void AmBasicSipDialog::onRxReply(const AmSipReply& reply)
   updateDialogTarget(reply);
   
   Status saved_status = status;
-  if(onRxReplyStatus(reply,t_it) && hdl)
-    hdl->onSipReply(t_it->second,reply,saved_status);
+  AmSipRequest orig_req(t_it->second);
+
+  if(onRxReplyStatus(reply) && hdl) {
+    hdl->onSipReply(orig_req,reply,saved_status);
+  }
 
   if((reply.code >= 200) && // final reply
      // but not for 2xx INV reply (wait for 200 ACK)
      ((reply.cseq_method != SIP_METH_INVITE) ||
       (reply.code >= 300))) {
        
-    uac_trans.erase(t_it);
+    uac_trans.erase(reply.cseq);
   }
 }
 
diff --git a/core/AmBasicSipDialog.h b/core/AmBasicSipDialog.h
index 29ef0b6..a6bf330 100644
--- a/core/AmBasicSipDialog.h
+++ b/core/AmBasicSipDialog.h
@@ -183,8 +183,7 @@ protected:
    *
    * @return true to continue processing, false otherwise
    */
-  virtual bool onRxReplyStatus(const AmSipReply& reply, 
-                              TransMap::iterator t_uac_it);
+  virtual bool onRxReplyStatus(const AmSipReply& reply);
 
   /**
    * Terminate pending UAS transactions
diff --git a/core/AmSipDialog.cpp b/core/AmSipDialog.cpp
index d2a930d..d0f2ad6 100644
--- a/core/AmSipDialog.cpp
+++ b/core/AmSipDialog.cpp
@@ -332,8 +332,7 @@ void AmSipDialog::onRequestTxed(const AmSipRequest& req)
   }
 }
 
-bool AmSipDialog::onRxReplyStatus(const AmSipReply& reply, 
-                                 TransMap::iterator t_uac_it)
+bool AmSipDialog::onRxReplyStatus(const AmSipReply& reply)
 {
   // rfc3261 12.1
   // Dialog established only by 101-199 or 2xx 
diff --git a/core/AmSipDialog.h b/core/AmSipDialog.h
index 650cb11..aea6834 100644
--- a/core/AmSipDialog.h
+++ b/core/AmSipDialog.h
@@ -68,7 +68,7 @@ protected:
   bool onRxReqSanity(const AmSipRequest& req);
   bool onRxReqStatus(const AmSipRequest& req);
 
-  bool onRxReplyStatus(const AmSipReply& reply, TransMap::iterator t_uac_it);
+  bool onRxReplyStatus(const AmSipReply& reply);
 
 
  public:

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to