Module: kamailio Branch: master Commit: c10c1d7f0214105c01a300b4a69c58219e4c970a URL: https://github.com/kamailio/kamailio/commit/c10c1d7f0214105c01a300b4a69c5821...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2025-06-08T12:10:30+02:00
core: keep a stack of msg env data
- GH #4258
---
Modified: src/core/srapi.c Modified: src/core/srapi.h
---
Diff: https://github.com/kamailio/kamailio/commit/c10c1d7f0214105c01a300b4a69c5821... Patch: https://github.com/kamailio/kamailio/commit/c10c1d7f0214105c01a300b4a69c5821...
---
diff --git a/src/core/srapi.c b/src/core/srapi.c index a16acf97d21..31eb2808835 100644 --- a/src/core/srapi.c +++ b/src/core/srapi.c @@ -75,29 +75,60 @@ sr_cfgenv_t *sr_cfgenv_get(void) /** * */ -void ksr_msg_env_push(ksr_msg_env_t *menv) +#define KSR_MSG_ENV_STACK_SIZE 8 +static ksr_msg_env_data_t _ksr_msg_env_stack[KSR_MSG_ENV_STACK_SIZE]; +static int _ksr_msg_env_stack_idx = 0; + +/** + * + */ +int ksr_msg_env_push(ksr_msg_env_links_t *oenv) { - menv->route_type = get_route_type(); - - menv->avps_uri_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, NULL); - menv->avps_uri_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, NULL); - menv->avps_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, NULL); - menv->avps_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, NULL); - menv->avps_domain_from = - set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, NULL); - menv->avps_domain_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, NULL); - menv->xavps = xavp_set_list(NULL); - menv->xavus = xavu_set_list(NULL); - menv->xavis = xavi_set_list(NULL); - - return; + ksr_msg_env_data_t *senv = NULL; + + if(_ksr_msg_env_stack_idx >= KSR_MSG_ENV_STACK_SIZE) { + LM_ERR("msg env stack size exceeded\n"); + return -1; + } + senv = &_ksr_msg_env_stack[_ksr_msg_env_stack_idx]; + memset(&_ksr_msg_env_stack[_ksr_msg_env_stack_idx], 0, + sizeof(ksr_msg_env_data_t)); + + oenv->route_type = get_route_type(); + + oenv->avps_uri_from = + set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, &senv->avps_uri_from); + oenv->avps_uri_to = + set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, &senv->avps_uri_to); + oenv->avps_user_from = set_avp_list( + AVP_TRACK_FROM | AVP_CLASS_USER, &senv->avps_user_from); + oenv->avps_user_to = + set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &senv->avps_user_to); + oenv->avps_domain_from = set_avp_list( + AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &senv->avps_domain_from); + oenv->avps_domain_to = set_avp_list( + AVP_TRACK_TO | AVP_CLASS_DOMAIN, &senv->avps_domain_to); + oenv->xavps = xavp_set_list(&senv->xavps); + oenv->xavus = xavu_set_list(&senv->xavus); + oenv->xavis = xavi_set_list(&senv->xavis); + + _ksr_msg_env_stack_idx++; + + return 0; }
/** * */ -void ksr_msg_env_pop(ksr_msg_env_t *menv) +int ksr_msg_env_pop(ksr_msg_env_links_t *menv) { + if(_ksr_msg_env_stack_idx <= 0) { + LM_ERR("invalid msg env stack index\n"); + return -1; + } + + /* current msg x/avp lists are expected to be cleaned up + * - just replace and pop */ set_route_type(menv->route_type);
set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, menv->avps_uri_from); @@ -110,5 +141,7 @@ void ksr_msg_env_pop(ksr_msg_env_t *menv) xavu_set_list(menv->xavus); xavi_set_list(menv->xavis);
- return; + _ksr_msg_env_stack_idx--; + + return 0; } diff --git a/src/core/srapi.h b/src/core/srapi.h index b573493a62b..d4c64c1976a 100644 --- a/src/core/srapi.h +++ b/src/core/srapi.h @@ -41,7 +41,21 @@ typedef struct sr_cfgenv void sr_cfgenv_init(void); sr_cfgenv_t *sr_cfgenv_get(void);
-typedef struct ksr_msg_env +typedef struct ksr_msg_env_data +{ + int route_type; + avp_list_t avps_user_from; + avp_list_t avps_user_to; + avp_list_t avps_domain_from; + avp_list_t avps_domain_to; + avp_list_t avps_uri_from; + avp_list_t avps_uri_to; + sr_xavp_t *xavps; + sr_xavp_t *xavus; + sr_xavp_t *xavis; +} ksr_msg_env_data_t; + +typedef struct ksr_msg_env_links { int route_type; avp_list_t *avps_user_from; @@ -53,9 +67,9 @@ typedef struct ksr_msg_env sr_xavp_t **xavps; sr_xavp_t **xavus; sr_xavp_t **xavis; -} ksr_msg_env_t; +} ksr_msg_env_links_t;
-void ksr_msg_env_push(ksr_msg_env_t *menv); -void ksr_msg_env_pop(ksr_msg_env_t *menv); +int ksr_msg_env_links_push(ksr_msg_env_links_t *menv); +int ksr_msg_env_links_pop(ksr_msg_env_links_t *menv);
#endif