Module: sems Branch: master Commit: 679ade9eb7c48b57bc9234bf6a5a9b9316d50e51 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=679ade9eb7c48b57bc9234bf6a5a9b9316d50e51
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Fri Nov 4 17:38:46 2011 +0100 b/f: in bye() don't do send_200_ack while iterating over uac_trans send_200_ack erases the transaction, which may lead to fault when iterating is continued Conflicts: core/AmSipDialog.cpp --- core/AmSipDialog.cpp | 33 ++++++++++++++++++++------------- 1 files changed, 20 insertions(+), 13 deletions(-) diff --git a/core/AmSipDialog.cpp b/core/AmSipDialog.cpp index 6e84494..411a5fc 100644 --- a/core/AmSipDialog.cpp +++ b/core/AmSipDialog.cpp @@ -1274,20 +1274,27 @@ int AmSipDialog::bye(const string& hdrs, int flags) switch(status){ case Disconnecting: - case Connected: - for (TransMap::iterator it=uac_trans.begin(); - it != uac_trans.end(); it++) { - if (it->second.method == "INVITE"){ - // finish any UAC transaction before sending BYE - send_200_ack(it->second.cseq); - } - } - if (status != Disconnecting) { - status = Disconnected; - return sendRequest("BYE", "", "", hdrs, flags); - } else { - return 0; + case Connected: { + // collect INVITE UAC transactions + vector<unsigned int> ack_trans; + for (TransMap::iterator it=uac_trans.begin(); it != uac_trans.end(); it++) { + if (it->second.method == "INVITE"){ + ack_trans.push_back(it->second.cseq); } + } + // finish any UAC transaction before sending BYE + for (vector<unsigned int>::iterator it= + ack_trans.begin(); it != ack_trans.end(); it++) { + send_200_ack(*it); + } + + if (status != Disconnecting) { + status = Disconnected; + return sendRequest("BYE", "", "", hdrs, flags); + } else { + return 0; + } + } case Trying: case Proceeding: _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
