Skip to content

Commit

Permalink
dialog: safer version for getting dlg variable value
Browse files Browse the repository at this point in the history
- clone to ensure that reference is not becoming invalid over the time
  • Loading branch information
miconda committed Aug 30, 2022
1 parent a070f5c commit aded00b
Showing 1 changed file with 34 additions and 10 deletions.
44 changes: 34 additions & 10 deletions src/modules/dialog/dlg_var.c
Expand Up @@ -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)
Expand Down

0 comments on commit aded00b

Please sign in to comment.