Module: sip-router
Branch: master
Commit: ed1a5476e82fa675861a86fb3c75555c578555d2
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ed1a547…
Author: fcabiddu <federico.cabiddu(a)gmail.com>
Committer: Federico Cabiddu <federico.cabiddu(a)gmail.com>
Date: Fri Sep 26 18:19:39 2014 +0200
tm: t_append_branches extra checks for cancelled transaction
---
modules/tm/t_append_branches.c | 31 +++++++++++++++++++++++++++++++
1 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/modules/tm/t_append_branches.c b/modules/tm/t_append_branches.c
index 637b11a..566a642 100644
--- a/modules/tm/t_append_branches.c
+++ b/modules/tm/t_append_branches.c
@@ -63,6 +63,7 @@ int t_append_branches(void) {
flag_t bflags = 0;
int new_branch, branch_ret, lowest_ret;
branch_bm_t added_branches;
+ int replies_locked = 0;
t = get_t();
if(t == NULL)
@@ -73,6 +74,9 @@ int t_append_branches(void) {
LM_DBG("transaction %u:%u in status %d\n", t->hash_index, t->label,
t->uas.status);
+ /* test if transaction has already been canceled */
+ if (t->flags & T_CANCELED) goto canceled;
+
if ((t->uas.status >= 200 && t->uas.status<=399)
|| ((t->uas.status >= 600 && t->uas.status)
&& !(t->flags & (T_6xx | T_DISABLE_6xx))) ) {
@@ -82,6 +86,7 @@ int t_append_branches(void) {
/* set the lock on the transaction here */
LOCK_REPLIES(t);
+ replies_locked = 1;
outgoings = t->nr_of_outgoings;
orig_msg = t->uas.request;
@@ -125,6 +130,10 @@ int t_append_branches(void) {
&path, 0, si, orig_msg->fwd_send_flags,
orig_msg->rcv.proto, (dst_uri.len)?-1:UAC_SKIP_BR_DST_F, &instance,
&ruid, &location_ua);
+
+ /* test if cancel was received meanwhile */
+ if (t->flags & T_CANCELED) goto canceled;
+
if (new_branch>=0)
added_branches |= 1<<new_branch;
else
@@ -143,6 +152,7 @@ int t_append_branches(void) {
if(lowest_ret!=E_CFG)
LOG(L_ERR, "ERROR: t_append_branch: failure to add branches\n");
ser_error=lowest_ret;
+ replies_locked = 0;
UNLOCK_REPLIES(t);
return lowest_ret;
}
@@ -175,12 +185,33 @@ int t_append_branches(void) {
ser_error=E_SEND;
/* else return the last error (?) */
/* the caller should take care and delete the transaction */
+ replies_locked = 0;
UNLOCK_REPLIES(t);
return -1;
}
ser_error=0; /* clear branch send errors, we have overall success */
set_kr(REQ_FWDED);
+ replies_locked = 0;
UNLOCK_REPLIES(t);
return 1;
+
+canceled:
+ DBG("t_append_branches: cannot append branches to a canceled transaction\n");
+ /* reset processed branches */
+ clear_branches();
+ /* restore backup flags from initial env */
+ setbflagsval(0, backup_bflags);
+ /* update message flags, if changed in branch route */
+ t->uas.request->flags = orig_msg->flags;
+ /* if needed unlock transaction's replies */
+ if (likely(replies_locked)) {
+ /* restore the number of outgoing branches
+ * since new branches have not been completed */
+ t->nr_of_outgoings = outgoings;
+ replies_locked = 0;
+ UNLOCK_REPLIES(t);
+ }
+ ser_error=E_CANCELED;
+ return -1;
}