diff --git a/src/core/xavp.c b/src/core/xavp.c index f9b0fd627f8..b3a26547640 100644 --- a/src/core/xavp.c +++ b/src/core/xavp.c @@ -57,6 +57,10 @@ void xavp_free(sr_xavp_t *xa) xa->val.v.data->pfree(xa->val.v.data->p, xavp_shm_free); shm_free(xa->val.v.data); } + } else if(xa->val.type == SR_XTYPE_SPTR) { + if(xa->val.v.vptr) { + shm_free(xa->val.v.vptr); + } } else if(xa->val.type == SR_XTYPE_XAVP) { xavp_destroy_list(&xa->val.v.xavp); } @@ -70,6 +74,10 @@ void xavp_free_unsafe(sr_xavp_t *xa) xa->val.v.data->pfree(xa->val.v.data->p, xavp_shm_free_unsafe); shm_free_unsafe(xa->val.v.data); } + } else if(xa->val.type == SR_XTYPE_SPTR) { + if(xa->val.v.vptr) { + shm_free_unsafe(xa->val.v.vptr); + } } else if(xa->val.type == SR_XTYPE_XAVP) { xavp_destroy_list_unsafe(&xa->val.v.xavp); } @@ -588,6 +596,9 @@ void xavp_print_list_content(sr_xavp_t **head, int level) case SR_XTYPE_VPTR: LM_INFO(" XAVP value: \n", avp->val.v.vptr); break; + case SR_XTYPE_SPTR: + LM_INFO(" XAVP value: \n", avp->val.v.vptr); + break; case SR_XTYPE_DATA: LM_INFO(" XAVP value: \n", avp->val.v.data); break; @@ -697,7 +708,7 @@ sr_xavp_t *xavp_clone_level_nodata(sr_xavp_t *xold) { return NULL; } - if(xold->val.type==SR_XTYPE_DATA) + if(xold->val.type==SR_XTYPE_DATA || xold->val.type==SR_XTYPE_SPTR) { LM_INFO("xavp value type is 'data' - ignoring in clone\n"); return NULL; @@ -720,7 +731,8 @@ sr_xavp_t *xavp_clone_level_nodata(sr_xavp_t *xold) while(oavp) { - if(oavp->val.type!=SR_XTYPE_DATA && oavp->val.type!=SR_XTYPE_XAVP) + if(oavp->val.type!=SR_XTYPE_DATA && oavp->val.type!=SR_XTYPE_XAVP + && oavp->val.type!=SR_XTYPE_SPTR) { navp = xavp_new_value(&oavp->name, &oavp->val); if(navp==NULL) diff --git a/src/core/xavp.h b/src/core/xavp.h index 4f440ea6128..84af5ad1825 100644 --- a/src/core/xavp.h +++ b/src/core/xavp.h @@ -33,7 +33,8 @@ typedef enum { SR_XTYPE_LONG, /* long value */ SR_XTYPE_LLONG, /* long long value */ SR_XTYPE_XAVP, /* xavp value */ - SR_XTYPE_VPTR, /* void pointer value */ + SR_XTYPE_VPTR, /* void pointer value (no free on destroy) */ + SR_XTYPE_SPTR, /* void pointer value (shm free on destroy) */ SR_XTYPE_DATA /* custom data value */ } sr_xtype_t;