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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2025-10-08T11:44:24+02:00

core: xavp - function to add xavp with different modes

- new mode to allocate space for a string value, but initialize it to
  empty string instead of copying over an input value
- related GH #4395

---

Modified: src/core/xavp.c
Modified: src/core/xavp.h

---

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

---

diff --git a/src/core/xavp.c b/src/core/xavp.c
index 21a8197080b..ba102a93e76 100644
--- a/src/core/xavp.c
+++ b/src/core/xavp.c
@@ -101,7 +101,13 @@ void xavp_free_unsafe(sr_xavp_t *xa)
        shm_free_unsafe(xa);
 }
 
-static sr_xavp_t *xavp_new_value(str *name, sr_xval_t *val)
+/**
+ * create a new value
+ * - mode:
+ *   - 0 allocate (val->v.s.len + 1) for value and copy over val->v.s.s
+ *   - 1 allocate (val->v.s.len + 1) for value, but set it to empty string
+ */
+static sr_xavp_t *xavp_new_value_mode(str *name, sr_xval_t *val, int mode)
 {
        sr_xavp_t *avp;
        int size;
@@ -128,7 +134,11 @@ static sr_xavp_t *xavp_new_value(str *name, sr_xval_t *val)
        memcpy(&avp->val, val, sizeof(sr_xval_t));
        if(val->type == SR_XTYPE_STR) {
                avp->val.v.s.s = avp->name.s + avp->name.len + 1;
-               memcpy(avp->val.v.s.s, val->v.s.s, val->v.s.len);
+               if(mode == 1) {
+                       avp->val.v.s.s[0] = '\0';
+               } else {
+                       memcpy(avp->val.v.s.s, val->v.s.s, val->v.s.len);
+               }
                avp->val.v.s.s[val->v.s.len] = '\0';
                avp->val.v.s.len = val->v.s.len;
        }
@@ -136,6 +146,11 @@ static sr_xavp_t *xavp_new_value(str *name, sr_xval_t *val)
        return avp;
 }
 
+static sr_xavp_t *xavp_new_value(str *name, sr_xval_t *val)
+{
+       return xavp_new_value_mode(name, val, 0);
+}
+
 int xavp_add(sr_xavp_t *xavp, sr_xavp_t **list)
 {
        if(xavp == NULL) {
@@ -205,11 +220,12 @@ int xavp_add_after(sr_xavp_t *nxavp, sr_xavp_t *pxavp)
        return 0;
 }
 
-sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
+sr_xavp_t *xavp_add_value_mode(
+               str *name, sr_xval_t *val, int mode, sr_xavp_t **list)
 {
        sr_xavp_t *avp = 0;
 
-       avp = xavp_new_value(name, val);
+       avp = xavp_new_value_mode(name, val, mode);
        if(avp == NULL)
                return NULL;
 
@@ -225,6 +241,11 @@ sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, 
sr_xavp_t **list)
        return avp;
 }
 
+sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list)
+{
+       return xavp_add_value_mode(name, val, 0, list);
+}
+
 sr_xavp_t *xavp_add_value_after(str *name, sr_xval_t *val, sr_xavp_t *pxavp)
 {
        sr_xavp_t *avp = 0;
diff --git a/src/core/xavp.h b/src/core/xavp.h
index b9131c2d2df..f273c508fac 100644
--- a/src/core/xavp.h
+++ b/src/core/xavp.h
@@ -80,6 +80,8 @@ int xavp_add(sr_xavp_t *xavp, sr_xavp_t **list);
 int xavp_add_last(sr_xavp_t *xavp, sr_xavp_t **list);
 int xavp_add_after(sr_xavp_t *nxavp, sr_xavp_t *pxavp);
 sr_xavp_t *xavp_add_value(str *name, sr_xval_t *val, sr_xavp_t **list);
+sr_xavp_t *xavp_add_value_mode(
+               str *name, sr_xval_t *val, int mode, sr_xavp_t **list);
 sr_xavp_t *xavp_add_value_after(str *name, sr_xval_t *val, sr_xavp_t *pxavp);
 sr_xavp_t *xavp_add_xavp_value(
                str *rname, str *name, sr_xval_t *val, sr_xavp_t **list);

_______________________________________________
Kamailio - Development Mailing List -- [email protected]
To unsubscribe send an email to [email protected]
Important: keep the mailing list in the recipients, do not reply only to the 
sender!

Reply via email to