Module: kamailio
Branch: master
Commit: c10c1d7f0214105c01a300b4a69c58219e4c970a
URL: 
https://github.com/kamailio/kamailio/commit/c10c1d7f0214105c01a300b4a69c58219e4c970a

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@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/c10c1d7f0214105c01a300b4a69c58219e4c970a.diff
Patch: 
https://github.com/kamailio/kamailio/commit/c10c1d7f0214105c01a300b4a69c58219e4c970a.patch

---

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

_______________________________________________
Kamailio - Development Mailing List -- sr-dev@lists.kamailio.org
To unsubscribe send an email to sr-dev-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to