Module: sems Branch: 1.4 Commit: a03278d09f744008d115ff9379be7139263466c3 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=a03278d09f744008d115ff9379be7139263466c3
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Fri Nov 4 17:14:54 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 --- core/AmSipDialog.cpp | 31 +++++++++++++++++++------------ 1 files changed, 19 insertions(+), 12 deletions(-) diff --git a/core/AmSipDialog.cpp b/core/AmSipDialog.cpp index d31357a..935a1f5 100644 --- a/core/AmSipDialog.cpp +++ b/core/AmSipDialog.cpp @@ -792,19 +792,26 @@ 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); - } + case Connected: { + // collect INVITE UAC transactions + vector<AmSipTransaction> 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); } - if (AmConfig::WaitForByeTransaction) - status = Disconnecting; - else - status = Disconnected; - return sendRequest("BYE", "", "", hdrs, flags); + } + // finish any UAC transaction before sending BYE + for (vector<AmSipTransaction>::iterator it= + ack_trans.begin(); it != ack_trans.end(); it++) { + send_200_ack(*it); + } + + if (AmConfig::WaitForByeTransaction) + status = Disconnecting; + else + status = Disconnected; + return sendRequest("BYE", "", "", hdrs, flags); + } case Pending: status = Disconnecting; _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
