Module: kamailio Branch: master Commit: aded00bbfe75771cef8d0ee9ae8401772f7644a9 URL: https://github.com/kamailio/kamailio/commit/aded00bbfe75771cef8d0ee9ae840177...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2022-08-30T13:32:16+02:00
dialog: safer version for getting dlg variable value
- clone to ensure that reference is not becoming invalid over the time
---
Modified: src/modules/dialog/dlg_var.c
---
Diff: https://github.com/kamailio/kamailio/commit/aded00bbfe75771cef8d0ee9ae840177... Patch: https://github.com/kamailio/kamailio/commit/aded00bbfe75771cef8d0ee9ae840177...
---
diff --git a/src/modules/dialog/dlg_var.c b/src/modules/dialog/dlg_var.c index cd151fd115..04e48fa636 100644 --- a/src/modules/dialog/dlg_var.c +++ b/src/modules/dialog/dlg_var.c @@ -279,22 +279,46 @@ void print_lists(struct dlg_cell *dlg) { } }
+static str _dlg_var_strval = STR_NULL; + str * get_dlg_variable(struct dlg_cell *dlg, str *key) { - str* var = NULL; + str* var = NULL;
- if( !dlg || !key || key->len > strlen(key->s)) - { - LM_ERR("BUG - bad parameters\n"); + if( !dlg || !key || key->len > strlen(key->s)) + { + LM_ERR("BUG - bad parameters\n");
- return NULL; - } + return NULL; + }
- dlg_lock(d_table, &(d_table->entries[dlg->h_entry])); - var = get_dlg_variable_unsafe( dlg, key); - dlg_unlock(d_table, &(d_table->entries[dlg->h_entry])); + dlg_lock(d_table, &(d_table->entries[dlg->h_entry])); + var = get_dlg_variable_unsafe( dlg, key); + if(var) { + _dlg_var_strval.len = pv_get_buffer_size(); + if(_dlg_var_strval.len < var->len+1) { + LM_ERR("pv buffer too small (%d) - needed %d\n", + _dlg_var_strval.len, var->len); + _dlg_var_strval.s = NULL; + _dlg_var_strval.len = 0; + var = NULL; + } else { + _dlg_var_strval.s = pv_get_buffer(); + strncpy(_dlg_var_strval.s, var->s, var->len); + _dlg_var_strval.len = var->len; + _dlg_var_strval.s[_dlg_var_strval.len] = '\0'; + } + } else { + _dlg_var_strval.s = NULL; + _dlg_var_strval.len = 0; + } + + dlg_unlock(d_table, &(d_table->entries[dlg->h_entry]));
- return var; + if(var) { + return &_dlg_var_strval; + } + return NULL; }
int get_dlg_variable_uintval(struct dlg_cell *dlg, str *key, unsigned int *uval)