Browse Source

fixed deadlock caused by broken From

Jiri Kuthan 22 years ago
parent
commit
d7027ef91b
1 changed files with 11 additions and 4 deletions
  1. 11 4
      modules/tm/t_lookup.c

+ 11 - 4
modules/tm/t_lookup.c

@@ -936,7 +936,7 @@ int init_rb( struct retr_buf *rb, struct sip_msg *msg)
 int t_newtran( struct sip_msg* p_msg )
 {
 
-	int ret, lret;
+	int ret, lret, my_err;
 	struct cell *new_cell;
 	struct sip_msg *shm_msg;
 
@@ -988,21 +988,24 @@ int t_newtran( struct sip_msg* p_msg )
 			if (p_msg->REQ_METHOD==METHOD_INVITE) {
 				if (parse_from_header(p_msg)<0) {
 					LOG(L_ERR, "ERROR: t_newtran: no valid From\n");
-					return E_BAD_REQ;
+					my_err=E_BAD_REQ;
+					goto new_err;
 				}
 			}
 			/* REVIEW */
 			/* make sure uri will be parsed before cloning */
 			if (parse_sip_msg_uri(p_msg)<0) {
 				LOG(L_ERR, "ERROR: t_new_tran: uri invalid\n");
-				return E_BAD_REQ;
+				my_err=E_BAD_REQ;
+				goto new_err;
 			}
 			
 			/* add new transaction */
 			new_cell = build_cell( p_msg ) ;
 			if  ( !new_cell ){
 				LOG(L_ERR, "ERROR: t_addifnew: out of mem:\n");
-				ret = E_OUT_OF_MEM;
+				my_err = E_OUT_OF_MEM;
+				goto new_err;
 			} else {
 				insert_into_hash_table_unsafe( new_cell );
 				set_t(new_cell);
@@ -1085,6 +1088,10 @@ int t_newtran( struct sip_msg* p_msg )
 	/* things are done -- return from script */
 	return 0;
 
+new_err:
+	UNLOCK_HASH(p_msg->hash_index);
+	return my_err;
+
 }