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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2023-12-19T10:57:40+01:00

ims_dialog: refactored kemi get/set profile functions

- expect final string values in the parameters, not with
  kamailio-specific variables, they can conflict in the external
  scripting languages and also leak pkg memory

---

Modified: src/modules/ims_dialog/ims_dialog.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/f036333b756c1021545e70871024561089954a56.diff
Patch: 
https://github.com/kamailio/kamailio/commit/f036333b756c1021545e70871024561089954a56.patch

---

diff --git a/src/modules/ims_dialog/ims_dialog.c 
b/src/modules/ims_dialog/ims_dialog.c
index 3c0454e5045..16a76a8cbe1 100644
--- a/src/modules/ims_dialog/ims_dialog.c
+++ b/src/modules/ims_dialog/ims_dialog.c
@@ -1068,7 +1068,6 @@ static int ki_is_known_dlg(sip_msg_t *msg)
 static int ki_set_dlg_profile(sip_msg_t *msg, str *sprofile, str *svalue)
 {
        struct dlg_profile_table *profile = NULL;
-       pv_elem_t *pvvalue = NULL;
 
        if(sprofile == NULL || sprofile->s == NULL || sprofile->len <= 0) {
                LM_ERR("invalid profile identifier\n");
@@ -1080,14 +1079,18 @@ static int ki_set_dlg_profile(sip_msg_t *msg, str 
*sprofile, str *svalue)
                LM_CRIT("profile <%.*s> not defined\n", sprofile->len, 
sprofile->s);
                return -1;
        }
-
-       if(pv_parse_format(svalue, &pvvalue) || pvvalue == NULL) {
-               LM_ERR("wrong format [%.*s] for value param!\n", svalue->len,
-                               svalue->s);
-               return -1;
+       if(svalue != NULL && svalue->len > 0) {
+               if(set_dlg_profile(msg, svalue, profile) < 0) {
+                       LM_ERR("failed to set profile with value\n");
+                       return -1;
+               }
+       } else {
+               if(set_dlg_profile(msg, NULL, profile) < 0) {
+                       LM_ERR("failed to set profile\n");
+                       return -1;
+               }
        }
-
-       return w_set_dlg_profile(msg, (char *)profile, (char *)pvvalue);
+       return 1;
 }
 
 static int ki_get_profile_size(
@@ -1095,8 +1098,9 @@ static int ki_get_profile_size(
 
 {
        struct dlg_profile_table *profile = NULL;
-       pv_elem_t *pvvalue = NULL;
        pv_spec_t *pvs = NULL;
+       unsigned int size;
+       pv_value_t val;
 
        if(sprofile == NULL || sprofile->s == NULL || sprofile->len <= 0) {
                LM_ERR("invalid profile identifier\n");
@@ -1111,11 +1115,6 @@ static int ki_get_profile_size(
                LM_CRIT("profile <%.*s> not defined\n", sprofile->len, 
sprofile->s);
                return -1;
        }
-       if(pv_parse_format(svalue, &pvvalue) || pvvalue == NULL) {
-               LM_ERR("wrong format [%.*s] for value param!\n", svalue->len,
-                               svalue->s);
-               return -1;
-       }
        pvs = pv_cache_get(spv);
        if(pvs == NULL) {
                LM_ERR("cannot get pv spec for [%.*s]\n", spv->len, spv->s);
@@ -1125,9 +1124,22 @@ static int ki_get_profile_size(
                LM_ERR("return must be an AVP or SCRIPT VAR!\n");
                return -1;
        }
+       if(svalue != NULL && svalue->len > 0 && profile->has_value != 0) {
+               size = get_profile_size(profile, svalue);
+       } else {
+               size = get_profile_size(profile, NULL);
+       }
+
+       memset(&val, 0, sizeof(pv_value_t));
+       val.flags = PV_VAL_INT | PV_TYPE_INT;
+       val.ri = (long)size;
+
+       if(pvs->setf(msg, &pvs->pvp, (int)EQ_T, &val) < 0) {
+               LM_ERR("setting profile PV failed\n");
+               return -1;
+       }
 
-       return w_get_profile_size3(
-                       msg, (char *)profile, (char *)pvvalue, (char *)pvs);
+       return 1;
 }
 
 /* clang-format off */

_______________________________________________
Kamailio (SER) - Development Mailing List
To unsubscribe send an email to [email protected]

Reply via email to