[sr-dev] git:master: tm: extra checks to see if the transaction was canceled before forwarding branches

Daniel-Constantin Mierla miconda at gmail.com
Fri Sep 26 09:01:44 CEST 2014


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

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Fri Sep 26 08:59:17 2014 +0200

tm: extra checks to see if the transaction was canceled before forwarding branches

- catch cases when CANCEL arrives during branch_route execution
- reported  Sławomir Bocheński, FS#468

---

 modules/tm/t_fwd.c |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/modules/tm/t_fwd.c b/modules/tm/t_fwd.c
index 3903679..61b6e6a 100644
--- a/modules/tm/t_fwd.c
+++ b/modules/tm/t_fwd.c
@@ -1664,11 +1664,10 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
 	/* make -Wall happy */
 	current_uri.s=0;
 
-	if (t->flags & T_CANCELED){
-		DBG("t_forward_non_ack: no forwarding on a canceled transaction\n");
-		ser_error=E_CANCELED;
-		return -1;
-	}
+	getbflagsval(0, &backup_bflags);
+
+	if (t->flags & T_CANCELED) goto canceled;
+
 	if (p_msg->REQ_METHOD==METHOD_CANCEL) { 
 		t_invite=t_lookupOriginalT(  p_msg );
 		if (t_invite!=T_NULL_CELL) {
@@ -1681,8 +1680,6 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
 		}
 	}
 
-	getbflagsval(0, &backup_bflags);
-
 	/* if no more specific error code is known, use this */
 	lowest_ret=E_UNSPEC;
 	/* branches added */
@@ -1727,6 +1724,8 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
 							p_msg->fwd_send_flags, proto,
 							(p_msg->dst_uri.len)?0:UAC_SKIP_BR_DST_F, &p_msg->instance,
 							&p_msg->ruid, &p_msg->location_ua);
+		/* test if cancel was received meanwhile */
+		if (t->flags & T_CANCELED) goto canceled;
 		if (branch_ret>=0) 
 			added_branches |= 1<<branch_ret;
 		else
@@ -1744,6 +1743,8 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
 							&path, proxy, si, p_msg->fwd_send_flags,
 							proto, (dst_uri.len)?0:UAC_SKIP_BR_DST_F, &instance,
 							&ruid, &location_ua);
+		/* test if cancel was received meanwhile */
+		if (t->flags & T_CANCELED) goto canceled;
 		/* pick some of the errors in case things go wrong;
 		   note that picking lowest error is just as good as
 		   any other algorithm which picks any other negative
@@ -1817,6 +1818,17 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
 	ser_error=0; /* clear branch send errors, we have overall success */
 	set_kr(REQ_FWDED);
 	return 1;
+
+canceled:
+	DBG("t_forward_non_ack: no forwarding on 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 = p_msg->flags;
+	ser_error=E_CANCELED;
+	return -1;
 }
 
 




More information about the sr-dev mailing list