Jelajahi Sumber

fixed bug in 6xx processing: if a 6xx reply is received, prevent any failure route/callback to create new branches (as RFC3261 says); This will aoutmatically fix the missing CANCELS when new branches were created after a 6xx reply.
Fixes bug #1901434

Warning: not really tested


git-svn-id: https://openser.svn.sourceforge.net/svnroot/openser/trunk@3873 689a6050-402a-0410-94f2-e92a70836424

Bogdan-Andrei Iancu 17 tahun lalu
induk
melakukan
0e1cb409fd

+ 26 - 13
modules_k/nathelper/nathelper.c

@@ -383,31 +383,44 @@ static int *rtpp_socks = 0;
 unsigned int *natping_state=0;
 
 static cmd_export_t cmds[] = {
-	{"fix_nated_contact",  (cmd_function)fix_nated_contact_f,    0, 0, 0,
+	{"fix_nated_contact",  (cmd_function)fix_nated_contact_f,    0,
+			0, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | BRANCH_ROUTE},
-	{"fix_nated_sdp",      (cmd_function)fix_nated_sdp_f,        1, fixup_fix_sdp, 0,
+	{"fix_nated_sdp",      (cmd_function)fix_nated_sdp_f,        1,
+			fixup_fix_sdp,  0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"fix_nated_sdp",      (cmd_function)fix_nated_sdp_f,        2, fixup_fix_sdp, 0,
+	{"fix_nated_sdp",      (cmd_function)fix_nated_sdp_f,        2,
+			fixup_fix_sdp, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"set_rtp_proxy_set",  (cmd_function)set_rtp_proxy_set_f,    1, fixup_set_id, 0,
+	{"set_rtp_proxy_set",  (cmd_function)set_rtp_proxy_set_f,    1,
+			fixup_set_id, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"unforce_rtp_proxy",  (cmd_function)unforce_rtp_proxy_f,    0, 0, 0,
+	{"unforce_rtp_proxy",  (cmd_function)unforce_rtp_proxy_f,    0,
+			0, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"force_rtp_proxy",    (cmd_function)force_rtp_proxy0_f,     0, 0, 0,
+	{"force_rtp_proxy",    (cmd_function)force_rtp_proxy0_f,     0,
+			0, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"force_rtp_proxy",    (cmd_function)force_rtp_proxy1_f,     1, 0, 0,
+	{"force_rtp_proxy",    (cmd_function)force_rtp_proxy1_f,     1,
+			0, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"force_rtp_proxy",    (cmd_function)force_rtp_proxy2_f,     2, 0, 0,
+	{"force_rtp_proxy",    (cmd_function)force_rtp_proxy2_f,     2,
+			0, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"nat_uac_test",       (cmd_function)nat_uac_test_f,         1, fixup_uint_null, 0,
+	{"nat_uac_test",       (cmd_function)nat_uac_test_f,         1,
+			fixup_uint_null, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE},
-	{"fix_nated_register", (cmd_function)fix_nated_register_f,   0, fixup_fix_nated_register, 0,
+	{"fix_nated_register", (cmd_function)fix_nated_register_f,   0,
+			fixup_fix_nated_register, 0,
 			REQUEST_ROUTE },
-	{"add_rcv_param",      (cmd_function)add_rcv_param_f,        0, 0, 0,
+	{"add_rcv_param",      (cmd_function)add_rcv_param_f,        0,
+			0, 0,
 			REQUEST_ROUTE },
-	{"add_rcv_param",      (cmd_function)add_rcv_param_f,        1, fixup_uint_null, 0,
+	{"add_rcv_param",      (cmd_function)add_rcv_param_f,        1,
+			fixup_uint_null, 0,
 			REQUEST_ROUTE },
-	{"start_recording",    (cmd_function)start_recording_f,      0, 0, 0,
+	{"start_recording",    (cmd_function)start_recording_f,      0,
+			0, 0,
 			REQUEST_ROUTE | ONREPLY_ROUTE },
 	{0, 0, 0, 0, 0, 0}
 };

+ 1 - 0
modules_k/sl/sl.c

@@ -243,6 +243,7 @@ static int w_sl_send_reply(struct sip_msg* msg, char* str1, char* str2)
 	return sl_send_reply(msg, code_i, &code_s);
 }
 
+
 int load_sl( struct sl_binds *slb)
 {
 	if(slb==NULL)

+ 3 - 0
modules_k/tm/h_table.h

@@ -187,6 +187,8 @@ struct totag_elem {
 #define T_PASS_PROVISIONAL_FLAG (1<<6)
 /* do auto DNS failover  */
 #define T_NO_DNS_FAILOVER_FLAG  (1<<7)
+/* transaction must not create new branches  */
+#define T_NO_NEW_BRANCHES_FLAG  (1<<7)
 
 /* transaction UAC's flags */
 /* is the UAC pending for CANCEL ?  */
@@ -333,6 +335,7 @@ struct s_table
 #define is_hopbyhop_cancel(_t_)  ((_t_)->flags&T_HOPBYHOP_CANCEL_FLAG)
 #define no_autoack(_t_)          ((_t_)->flags&T_NO_AUTOACK_FLAG)
 #define pass_provisional(_t_)    ((_t_)->flags&T_PASS_PROVISIONAL_FLAG)
+#define no_new_branches(_t_)     ((_t_)->flags&T_NO_NEW_BRANCHES_FLAG)
 
 
 extern int syn_branch;

+ 2 - 2
modules_k/tm/t_fwd.c

@@ -601,8 +601,8 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
 	}
 
 	/* do not forward requests which were already cancelled*/
-	if (was_cancelled(t)) {
-		LM_ERR("discarding fwd for a cancelled transaction\n");
+	if (was_cancelled(t) || no_new_branches(t)) {
+		LM_ERR("discarding fwd for a cancelled/6xx transaction\n");
 		ser_error = E_NO_DESTINATION;
 		return -1;
 	}

+ 2 - 0
modules_k/tm/t_reply.c

@@ -784,6 +784,8 @@ static enum rps t_should_relay_response( struct cell *Trans , int new_code,
 			/* this is a winner and close all branches */
 			which_cancel( Trans, cancel_bitmap );
 			picked_branch=branch;
+			/* no more new branches should be added to this transaction */
+			Trans->flags |= T_NO_NEW_BRANCHES_FLAG;
 		} else {
 			/* if all_final return lowest */
 			picked_branch = t_pick_branch( Trans, &picked_code);