From 6fd6b733615ea5c179f1159f8eea2c0ab4c7892c Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Fri, 2 Jun 2017 12:43:22 +0200 Subject: [PATCH] TT#10136 pv: pv_var_to_xavp() and pv_xavp_to_var() fix Change-Id: I7d7b629be707066de20d3dfec5e8f375b6a72390 --- debian/patches/series | 1 + ...to_xavp-and-pv_xavp_to_var-functions.patch | 129 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 debian/patches/upstream/0054-pv-fix-pv_var_to_xavp-and-pv_xavp_to_var-functions.patch diff --git a/debian/patches/series b/debian/patches/series index 188afc759..d7d8777a8 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -15,6 +15,7 @@ upstream/0017-pua_reginfo-fix-memory-leak-when-usrloc-is-DB_ONLY.patch upstream/0018-usrloc-fix-ucontact-shared-leak.patch upstream/0019-presence-remove-transaction-creation-from-publ_notif.patch upstream/0037-tls-do-kerberos-and-zlib-init-checks-only-for-libssl.patch +upstream/0054-pv-fix-pv_var_to_xavp-and-pv_xavp_to_var-functions.patch # upsream fixes from master upstream/pv-new-function-pv_evalx-dst-fmt.patch upstream/pv_trans_cfg_line.patch diff --git a/debian/patches/upstream/0054-pv-fix-pv_var_to_xavp-and-pv_xavp_to_var-functions.patch b/debian/patches/upstream/0054-pv-fix-pv_var_to_xavp-and-pv_xavp_to_var-functions.patch new file mode 100644 index 000000000..d516bd584 --- /dev/null +++ b/debian/patches/upstream/0054-pv-fix-pv_var_to_xavp-and-pv_xavp_to_var-functions.patch @@ -0,0 +1,129 @@ +From b7bd4beabe76b01342afb4eb84ea4a4a68863efe Mon Sep 17 00:00:00 2001 +From: Victor Seva +Date: Sun, 4 Jun 2017 12:46:59 +0200 +Subject: [PATCH 54/55] pv: fix pv_var_to_xavp() and pv_xavp_to_var() functions + +* xavp was not properly created at pv_var_to_xavp() +* add proper xavp loop for pv_xavp_to_var() +--- + modules/pv/pv_xavp.c | 54 ++++++++++++++++++++++++++++++++++------------------ + 1 file changed, 35 insertions(+), 19 deletions(-) + +diff --git a/modules/pv/pv_xavp.c b/modules/pv/pv_xavp.c +index 28bb06ed2..d6fd83d95 100644 +--- a/modules/pv/pv_xavp.c ++++ b/modules/pv/pv_xavp.c +@@ -622,7 +622,7 @@ int xavp_params_explode(str *params, str *xname) + int pv_var_to_xavp(str *varname, str *xname) + { + script_var_t *it; +- sr_xavp_t *xavp = NULL; ++ sr_xavp_t *avp = NULL; + sr_xval_t xval; + + LM_DBG("xname:%.*s varname:%.*s\n", xname->len, xname->s, +@@ -638,18 +638,29 @@ int pv_var_to_xavp(str *varname, str *xname) + { + xval.type = SR_XTYPE_INT; + xval.v.i = it->v.value.n; ++ LM_DBG("[%.*s]: %d\n", it->name.len, it->name.s, xval.v.i); + } else { + if(it->v.value.s.len==0) continue; + xval.type = SR_XTYPE_STR; + xval.v.s.s = it->v.value.s.s; + xval.v.s.len = it->v.value.s.len; ++ LM_DBG("[%.*s]: '%.*s'\n", it->name.len, it->name.s, ++ xval.v.s.len, xval.v.s.s); + } +- xavp = xavp_add_xavp_value(xname, &it->name, &xval, NULL); +- if(xavp==NULL) { ++ if(xavp_add_value(&it->name, &xval, &avp)==NULL) { + LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s); + goto error; + } + } ++ if(avp) { ++ memset(&xval, 0, sizeof(sr_xval_t)); ++ xval.type = SR_XTYPE_XAVP; ++ xval.v.xavp = avp; ++ if(xavp_add_value(xname, &xval, NULL)==NULL) { ++ LM_ERR("Can't create xavp[%.*s]\n", xname->len, xname->s); ++ goto error; ++ } ++ } + } + else { + it = get_var_by_name(varname); +@@ -662,21 +673,23 @@ int pv_var_to_xavp(str *varname, str *xname) + { + xval.type = SR_XTYPE_INT; + xval.v.i = it->v.value.n; ++ LM_DBG("[%.*s]: %d\n", it->name.len, it->name.s, xval.v.i); + } else { + xval.type = SR_XTYPE_STR; + xval.v.s.s = it->v.value.s.s; + xval.v.s.len = it->v.value.s.len; ++ LM_DBG("[%.*s]: '%.*s'\n", it->name.len, it->name.s, ++ xval.v.s.len, xval.v.s.s); + } +- xavp = xavp_add_xavp_value(xname, &it->name, &xval, NULL); +- if(xavp==NULL) { ++ if(xavp_add_xavp_value(xname, &it->name, &xval, NULL)==NULL) { + LM_ERR("can't copy [%.*s]\n", it->name.len, it->name.s); +- goto error; ++ return -1; + } + } + return 1; + + error: +- xavp_rm_by_name(xname, 1, NULL); ++ if(avp) xavp_destroy_list(&avp); + return -1; + } + +@@ -691,7 +704,7 @@ int pv_xavp_to_var_helper(sr_xavp_t *avp) { + flags |= VAR_VAL_STR; + value.s.len = avp->val.v.s.len; + value.s.s = avp->val.v.s.s; +- LM_DBG("var:[%.*s] STR:[%.*s]\n", avp->name.len, avp->name.s, ++ LM_DBG("var:[%.*s] STR:[%.*s]\n", avp->name.len, avp->name.s, + value.s.len, value.s.s); + } + else if(avp->val.type==SR_XTYPE_INT) { +@@ -723,18 +736,21 @@ int pv_xavp_to_var(str *xname) { + LM_ERR("%.*s not xavp type?\n", xname->len, xname->s); + return -1; + } +- avp = xavp->val.v.xavp; +- if (avp) +- { +- if(pv_xavp_to_var_helper(avp)<0) return -1; +- avp = avp->next; +- } ++ do { ++ avp = xavp->val.v.xavp; ++ if (avp) ++ { ++ if(pv_xavp_to_var_helper(avp)<0) return -1; ++ avp = avp->next; ++ } + +- while(avp) +- { +- if(pv_xavp_to_var_helper(avp)<0) return -1; +- avp = avp->next; +- } ++ while(avp) ++ { ++ if(pv_xavp_to_var_helper(avp)<0) return -1; ++ avp = avp->next; ++ } ++ xavp = xavp_get_next(xavp); ++ } while(xavp); + return 1; + } + #endif +-- +2.11.0 +