TT#188700 pv_headers: rework pvh_remove_header_param, take two

Change-Id: Ib9741001b99f7a2db24c0a49cfdf0b34728c81db
(cherry picked from commit 816232dc74)
(cherry picked from commit afa90dc2b8)
mr10.5.1
Victor Seva 4 years ago committed by Víctor Seva
parent 8fce53709d
commit ade391071d

@ -64,6 +64,7 @@ sipwise/presence-be-more-resilient-doing-clean-up.patch
sipwise/tm-check-again-T-just-in-case-before-UNREF.patch
upstream/pv_headers-use-tm.t_find-API.patch
upstream/tm-new-inter-module-API-function-t_find.patch
sipwise/pv_headers-rework-pvh_remove_header_param-take-two.patch
#
### Don't just put stuff in any order
### use gbp pq import/export tooling to help maintain patches

@ -0,0 +1,241 @@
From: Victor Seva <vseva@sipwise.com>
Date: Mon, 29 Aug 2022 13:59:38 +0200
Subject: pv_headers: rework pvh_remove_header_param, take two
* pvh_set_xavi changes/removes xavi, so we need the new value
* after pvh_remove_header, search for the header again
---
src/modules/pv_headers/pv_headers.c | 18 ++++++++++++++----
src/modules/pv_headers/pvh_func.c | 12 ++++++++----
src/modules/pv_headers/pvh_xavp.c | 34 +++++++++++++++-------------------
src/modules/pv_headers/pvh_xavp.h | 2 +-
4 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/src/modules/pv_headers/pv_headers.c b/src/modules/pv_headers/pv_headers.c
index 7da426c..a41658e 100644
--- a/src/modules/pv_headers/pv_headers.c
+++ b/src/modules/pv_headers/pv_headers.c
@@ -222,12 +222,15 @@ static int w_pvh_header_param_exists(
static int ki_pvh_remove_header_param(struct sip_msg *msg, str *hname, str *toRemove)
{
- int idx;
+ int next;
+ int idx = 0;
int new_size;
str dst = STR_NULL;
sr_xavp_t *avi = pvh_xavi_get_child(msg, &xavi_name, hname);
- for(idx=0; avi != NULL; avi = xavi_get_next(avi)) {
+ while(avi) {
+ next = 1;
+ LM_DBG("hname:%.*s[%d]\n", STR_FMT(hname), idx);
if (avi->val.type == SR_XTYPE_STR && avi->val.v.s.s != NULL) {
if(str_casesearch(&avi->val.v.s, toRemove) != NULL) {
new_size = pvh_remove_header_param_helper(&avi->val.v.s, toRemove, &dst);
@@ -236,13 +239,17 @@ static int ki_pvh_remove_header_param(struct sip_msg *msg, str *hname, str *toRe
STR_FMT(hname), idx);
if(pvh_remove_header(msg, hname, idx) < 0)
return -1;
+ avi = pvh_xavi_get_child(msg, &xavi_name, hname);
+ if(idx > 0) idx = 0;
+ next = 0;
} else if(dst.len < 0 || new_size == avi->val.v.s.len) {
LM_DBG("'%.*s' not found at '%.*s'\n", STR_FMT(toRemove),
STR_FMT(&avi->val.v.s));
} else {
LM_DBG("old_value:'%.*s' new_value:'%.*s'\n",
STR_FMT(&avi->val.v.s), STR_FMT(&dst));
- if(pvh_set_xavi(msg, &xavi_name, hname, &dst, SR_XTYPE_STR, idx, 0) < 0) {
+ avi = pvh_set_xavi(msg, &xavi_name, hname, &dst, SR_XTYPE_STR, idx, 0);
+ if(avi == NULL) {
LM_ERR("can't set new value\n");
return -1;
}
@@ -252,7 +259,10 @@ static int ki_pvh_remove_header_param(struct sip_msg *msg, str *hname, str *toRe
STR_FMT(&avi->val.v.s));
}
}
- idx++;
+ if(next) {
+ avi = xavi_get_next(avi);
+ idx++;
+ }
}
return 1;
}
diff --git a/src/modules/pv_headers/pvh_func.c b/src/modules/pv_headers/pvh_func.c
index a6adaa1..0eddeea 100644
--- a/src/modules/pv_headers/pvh_func.c
+++ b/src/modules/pv_headers/pvh_func.c
@@ -325,12 +325,16 @@ int pvh_check_header(struct sip_msg *msg, str *hname)
int pvh_append_header(struct sip_msg *msg, str *hname, str *hvalue)
{
- return pvh_set_xavi(msg, &xavi_name, hname, hvalue, SR_XTYPE_STR, 0, 1);
+ if(pvh_set_xavi(msg, &xavi_name, hname, hvalue, SR_XTYPE_STR, 0, 1) == NULL)
+ return -1;
+ return 1;
}
int pvh_modify_header(struct sip_msg *msg, str *hname, str *hvalue, int indx)
{
- return pvh_set_xavi(msg, &xavi_name, hname, hvalue, SR_XTYPE_STR, indx, 0);
+ if(pvh_set_xavi(msg, &xavi_name, hname, hvalue, SR_XTYPE_STR, indx, 0) == NULL)
+ return -1;
+ return 1;
}
int pvh_remove_header(struct sip_msg *msg, str *hname, int indx)
@@ -346,12 +350,12 @@ int pvh_remove_header(struct sip_msg *msg, str *hname, int indx)
do {
if(pvh_set_xavi(
msg, &xavi_name, hname, NULL, SR_XTYPE_STR, indx++, 0)
- < 1)
+ == NULL)
return -1;
} while(indx < count);
} else {
if(pvh_set_xavi(msg, &xavi_name, hname, NULL, SR_XTYPE_STR, indx, 0)
- < 1)
+ == NULL)
return -1;
}
diff --git a/src/modules/pv_headers/pvh_xavp.c b/src/modules/pv_headers/pvh_xavp.c
index 8b2acbf..50cac4f 100644
--- a/src/modules/pv_headers/pvh_xavp.c
+++ b/src/modules/pv_headers/pvh_xavp.c
@@ -131,18 +131,18 @@ static sr_xavp_t *pvh_xavi_new_value(str *name, sr_xval_t *val)
return avp;
}
-int pvh_xavi_append_value(str *name, sr_xval_t *val, sr_xavp_t **start)
+static sr_xavp_t * pvh_xavi_append_value(str *name, sr_xval_t *val, sr_xavp_t **start)
{
sr_xavp_t *last = NULL;
sr_xavp_t *xavi = NULL;
if((xavi = pvh_xavi_new_value(name, val)) == NULL)
- return -1;
+ return xavi;
if(*start == NULL) {
xavi->next = *start;
*start = xavi;
- return 1;
+ return xavi;
}
last = *start;
@@ -150,13 +150,13 @@ int pvh_xavi_append_value(str *name, sr_xval_t *val, sr_xavp_t **start)
last = last->next;
last->next = xavi;
- return 1;
+ return xavi;
}
/**
*
*/
-static int pvh_xavi_set_value(
+static sr_xavp_t * pvh_xavi_set_value(
str *name, sr_xval_t *val, int idx, sr_xavp_t **start)
{
int cnt = 0;
@@ -166,14 +166,11 @@ static int pvh_xavi_set_value(
idx = idx + cnt;
if(idx < 0) {
LM_ERR("wrong calculated idx:%d\n", idx);
- return -1;
+ return NULL;
}
}
LM_DBG("xavi name: %.*s\n", name->len, name->s);
- if(xavi_set_value(name, idx, val, start) == NULL)
- return -1;
-
- return 1;
+ return xavi_set_value(name, idx, val, start);
}
/**
@@ -356,11 +353,12 @@ int pvh_xavi_keys_count(sr_xavp_t **start)
/**
*
*/
-int pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
+sr_xavp_t * pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
sr_xtype_t type, int idx, int append)
{
sr_xavp_t **xavi = NULL;
sr_xavp_t *root = NULL;
+ sr_xavp_t *result = NULL;
sr_xval_t root_xval;
sr_xval_t xval;
char t[header_name_size];
@@ -368,7 +366,7 @@ int pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
if(xname == NULL || name == NULL) {
LM_ERR("missing xavi/pv name\n");
- return -1;
+ return result;
}
pvh_get_branch_xname(msg, xname, &br_xname);
@@ -385,7 +383,7 @@ int pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
xval.v.data = (sr_data_t *)shm_malloc(sizeof(sr_data_t));
if(xval.v.data == NULL) {
SHM_MEM_ERROR;
- return -1;
+ return result;
}
memset(xval.v.data, 0, sizeof(sr_data_t));
xval.v.data->p = data;
@@ -409,7 +407,7 @@ int pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
if((root = xavi_add_value(&br_xname, &root_xval, NULL)) == NULL) {
LM_ERR("error create xavi %.*s\n", br_xname.len, br_xname.s);
- return -1;
+ return NULL;
}
xavi = &root->val.v.xavp;
} else if(xavi_get_child(&br_xname, name) == NULL) {
@@ -417,20 +415,18 @@ int pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
}
if(append) {
- if(pvh_xavi_append_value(name, &xval, xavi) < 0) {
+ if((result = pvh_xavi_append_value(name, &xval, xavi)) == NULL) {
LM_ERR("error append xavi=>name %.*s=>%.*s\n", br_xname.len,
br_xname.s, name->len, name->s);
- return -1;
}
} else {
- if(pvh_xavi_set_value(name, &xval, idx, xavi) < 0) {
+ if((result = pvh_xavi_set_value(name, &xval, idx, xavi)) == NULL) {
LM_ERR("error modify xavi=>name %.*s=>%.*s idx=%d\n", br_xname.len,
br_xname.s, name->len, name->s, idx);
- return -1;
}
}
- return 1;
+ return result;
}
diff --git a/src/modules/pv_headers/pvh_xavp.h b/src/modules/pv_headers/pvh_xavp.h
index 646ebd7..2ced2eb 100644
--- a/src/modules/pv_headers/pvh_xavp.h
+++ b/src/modules/pv_headers/pvh_xavp.h
@@ -33,7 +33,7 @@
int pvh_reply_append(sr_xavp_t **start);
-int pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
+sr_xavp_t * pvh_set_xavi(struct sip_msg *msg, str *xname, str *name, void *data,
sr_xtype_t type, int idx, int append);
int pvh_xavi_keys_count(sr_xavp_t **start);
sr_xavp_t *pvh_xavi_get_child(struct sip_msg *msg, str *xname, str *name);
Loading…
Cancel
Save