diff --git a/src/modules/tm/h_table.c b/src/modules/tm/h_table.c index 79e7a17ed49..8acf1cd8a82 100644 --- a/src/modules/tm/h_table.c +++ b/src/modules/tm/h_table.c @@ -259,6 +259,8 @@ void free_cell_helper( xavp_destroy_list_unsafe(&dead_cell->xavps_list); if(dead_cell->xavus_list) xavu_destroy_list_unsafe(&dead_cell->xavus_list); + if(dead_cell->xavis_list) + xavi_destroy_list_unsafe(&dead_cell->xavis_list); memset(dead_cell, 0, sizeof(tm_cell_t)); /* the cell's body */ @@ -372,6 +374,10 @@ struct cell *build_cell(struct sip_msg *p_msg) new_cell->xavus_list = *xold; *xold = 0; + xold = xavi_set_list(&new_cell->xavis_list); + new_cell->xavis_list = *xold; + *xold = 0; + /* We can just store pointer to domain avps in the transaction context, * because they are read-only */ new_cell->domain_avps_from = @@ -430,11 +436,13 @@ struct cell *build_cell(struct sip_msg *p_msg) destroy_avp_list(&new_cell->uri_avps_to); xavp_destroy_list(&new_cell->xavps_list); xavu_destroy_list(&new_cell->xavus_list); + xavi_destroy_list(&new_cell->xavis_list); shm_free(new_cell); /* unlink transaction AVP list and link back the global AVP list (bogdan)*/ reset_avps(); xavp_reset_list(); xavu_reset_list(); + xavi_reset_list(); return NULL; } @@ -531,6 +539,7 @@ void tm_xdata_swap(tm_cell_t *t, tm_xlinks_t *xd, int mode) AVP_TRACK_TO | AVP_CLASS_DOMAIN, &t->domain_avps_to); x->xavps_list = xavp_set_list(&t->xavps_list); x->xavus_list = xavu_set_list(&t->xavus_list); + x->xavis_list = xavi_set_list(&t->xavis_list); } else if(mode == 1) { /* restore original avp list */ set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, x->uri_avps_from); @@ -541,6 +550,7 @@ void tm_xdata_swap(tm_cell_t *t, tm_xlinks_t *xd, int mode) set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, x->domain_avps_to); xavp_set_list(x->xavps_list); xavu_set_list(x->xavus_list); + xavi_set_list(x->xavis_list); } } @@ -559,6 +569,7 @@ void tm_xdata_replace(tm_xdata_t *newxd, tm_xlinks_t *bakxd) set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, bakxd->domain_avps_to); xavp_set_list(bakxd->xavps_list); xavu_set_list(bakxd->xavus_list); + xavi_set_list(bakxd->xavis_list); return; } @@ -577,6 +588,7 @@ void tm_xdata_replace(tm_xdata_t *newxd, tm_xlinks_t *bakxd) AVP_TRACK_TO | AVP_CLASS_DOMAIN, &newxd->domain_avps_to); bakxd->xavps_list = xavp_set_list(&newxd->xavps_list); bakxd->xavus_list = xavu_set_list(&newxd->xavus_list); + bakxd->xavis_list = xavi_set_list(&newxd->xavis_list); return; } } diff --git a/src/modules/tm/h_table.h b/src/modules/tm/h_table.h index 2179ec027a6..ee92087f8aa 100644 --- a/src/modules/tm/h_table.h +++ b/src/modules/tm/h_table.h @@ -309,6 +309,7 @@ typedef struct tm_xdata struct usr_avp *domain_avps_to; sr_xavp_t *xavps_list; sr_xavp_t *xavus_list; + sr_xavp_t *xavis_list; } tm_xdata_t; @@ -326,6 +327,7 @@ typedef struct tm_xlinks struct usr_avp **domain_avps_to; sr_xavp_t **xavps_list; sr_xavp_t **xavus_list; + sr_xavp_t **xavis_list; } tm_xlinks_t; @@ -400,6 +402,7 @@ typedef struct cell struct usr_avp *domain_avps_to; sr_xavp_t *xavps_list; sr_xavp_t *xavus_list; + sr_xavp_t *xavis_list; /* protection against concurrent reply processing */ ser_lock_t reply_mutex; diff --git a/src/modules/tm/t_hooks.c b/src/modules/tm/t_hooks.c index 5df8ff4caec..461225804aa 100644 --- a/src/modules/tm/t_hooks.c +++ b/src/modules/tm/t_hooks.c @@ -230,6 +230,7 @@ void run_trans_callbacks_internal(struct tmcb_head_list* cb_lst, int type, avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to, *backup_uri_from, *backup_uri_to; sr_xavp_t **backup_xavps; sr_xavp_t **backup_xavus; + sr_xavp_t **backup_xavis; backup_uri_from = set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, &trans->uri_avps_from ); @@ -245,6 +246,7 @@ void run_trans_callbacks_internal(struct tmcb_head_list* cb_lst, int type, &trans->domain_avps_to); backup_xavps = xavp_set_list(&trans->xavps_list); backup_xavus = xavu_set_list(&trans->xavus_list); + backup_xavis = xavi_set_list(&trans->xavis_list); cbp=(struct tm_callback*)cb_lst->first; while(cbp){ @@ -265,6 +267,7 @@ void run_trans_callbacks_internal(struct tmcb_head_list* cb_lst, int type, set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, backup_uri_from ); xavp_set_list(backup_xavps); xavu_set_list(backup_xavus); + xavi_set_list(backup_xavis); } @@ -321,6 +324,7 @@ static void run_reqin_callbacks_internal(struct tmcb_head_list* hl, *backup_uri_from, *backup_uri_to; sr_xavp_t **backup_xavps; sr_xavp_t **backup_xavus; + sr_xavp_t **backup_xavis; if (hl==0 || hl->first==0) return; backup_uri_from = set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, @@ -337,6 +341,7 @@ static void run_reqin_callbacks_internal(struct tmcb_head_list* hl, &trans->domain_avps_to); backup_xavps = xavp_set_list(&trans->xavps_list); backup_xavus = xavu_set_list(&trans->xavus_list); + backup_xavis = xavi_set_list(&trans->xavis_list); for (cbp=(struct tm_callback*)hl->first; cbp; cbp=cbp->next) { LM_DBG("trans=%p, callback type %d, id %d entered\n", trans, cbp->types, cbp->id ); @@ -351,6 +356,7 @@ static void run_reqin_callbacks_internal(struct tmcb_head_list* hl, set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, backup_from ); xavp_set_list(backup_xavps); xavu_set_list(backup_xavus); + xavi_set_list(backup_xavis); } diff --git a/src/modules/tm/t_reply.c b/src/modules/tm/t_reply.c index b645f3c2b6e..5b1ad5d2f11 100644 --- a/src/modules/tm/t_reply.c +++ b/src/modules/tm/t_reply.c @@ -700,6 +700,7 @@ typedef struct tm_faked_env { avp_list_t* backup_uri_to; sr_xavp_t **backup_xavps; sr_xavp_t **backup_xavus; + sr_xavp_t **backup_xavis; struct socket_info* backup_si; struct lump *backup_add_rm; struct lump *backup_body_lumps; @@ -791,6 +792,8 @@ int faked_env(struct cell *t, struct sip_msg *msg, int is_async_env) = xavp_set_list(&t->xavps_list); _tm_faked_env[_tm_faked_env_idx].backup_xavus = xavu_set_list(&t->xavus_list); + _tm_faked_env[_tm_faked_env_idx].backup_xavis + = xavi_set_list(&t->xavis_list); /* set default send address to the saved value */ _tm_faked_env[_tm_faked_env_idx].backup_si = bind_address; bind_address = t->uac[0].request.dst.send_sock; @@ -827,6 +830,7 @@ int faked_env(struct cell *t, struct sip_msg *msg, int is_async_env) _tm_faked_env[_tm_faked_env_idx].backup_uri_to); xavp_set_list(_tm_faked_env[_tm_faked_env_idx].backup_xavps); xavu_set_list(_tm_faked_env[_tm_faked_env_idx].backup_xavus); + xavi_set_list(_tm_faked_env[_tm_faked_env_idx].backup_xavis); bind_address = _tm_faked_env[_tm_faked_env_idx].backup_si; /* restore lump lists */ if(t!=NULL) { @@ -2290,6 +2294,7 @@ int reply_received( struct sip_msg *p_msg ) avp_list_t* backup_uri_from, *backup_uri_to; sr_xavp_t **backup_xavps; sr_xavp_t **backup_xavus; + sr_xavp_t **backup_xavis; int replies_locked = 0; #ifdef USE_DNS_FAILOVER int branch_ret; @@ -2480,6 +2485,7 @@ int reply_received( struct sip_msg *p_msg ) &t->domain_avps_to ); backup_xavps = xavp_set_list(&t->xavps_list); backup_xavus = xavu_set_list(&t->xavus_list); + backup_xavis = xavi_set_list(&t->xavis_list); setbflagsval(0, uac->branch_flags); if(msg_status>last_uac_status) { /* current response (msg) status is higher that the last received @@ -2525,6 +2531,7 @@ int reply_received( struct sip_msg *p_msg ) set_avp_list( AVP_TRACK_TO | AVP_CLASS_DOMAIN, backup_domain_to ); xavp_set_list(backup_xavps); xavu_set_list(backup_xavus); + xavi_set_list(backup_xavis); /* handle a possible DROP in the script, but only if this * is not a final reply (final replies already stop the timers * and droping them might leave a transaction living forever) */