dfilter: Use a function pointer array to free registers

This commit is contained in:
João Valverde 2022-03-18 12:47:29 +00:00 committed by A Wireshark GitLab Utility
parent 89a39134ff
commit 631cf34f0c
3 changed files with 11 additions and 16 deletions

View File

@ -22,7 +22,7 @@ struct epan_dfilter {
guint num_registers; guint num_registers;
GSList **registers; GSList **registers;
gboolean *attempted_load; gboolean *attempted_load;
gboolean *owns_memory; GDestroyNotify *free_registers;
int *interesting_fields; int *interesting_fields;
int num_interesting_fields; int num_interesting_fields;
GPtrArray *deprecated; GPtrArray *deprecated;

View File

@ -204,7 +204,7 @@ dfilter_free(dfilter_t *df)
g_free(df->registers); g_free(df->registers);
g_free(df->attempted_load); g_free(df->attempted_load);
g_free(df->owns_memory); g_free(df->free_registers);
g_free(df); g_free(df);
} }
@ -447,7 +447,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
dfilter->num_registers = dfw->next_register; dfilter->num_registers = dfw->next_register;
dfilter->registers = g_new0(GSList *, dfilter->num_registers); dfilter->registers = g_new0(GSList *, dfilter->num_registers);
dfilter->attempted_load = g_new0(gboolean, dfilter->num_registers); dfilter->attempted_load = g_new0(gboolean, dfilter->num_registers);
dfilter->owns_memory = g_new0(gboolean, dfilter->num_registers); dfilter->free_registers = g_new0(GDestroyNotify, dfilter->num_registers);
/* And give it to the user. */ /* And give it to the user. */
*dfp = dfilter; *dfp = dfilter;

View File

@ -370,7 +370,7 @@ read_tree(dfilter_t *df, proto_tree *tree,
df->registers[reg] = fvalues; df->registers[reg] = fvalues;
// These values are referenced only, do not try to free it later. // These values are referenced only, do not try to free it later.
df->owns_memory[reg] = FALSE; df->free_registers[reg] = NULL;
return TRUE; return TRUE;
} }
@ -485,13 +485,6 @@ any_in_range(dfilter_t *df, dfvm_value_t *arg1,
return FALSE; return FALSE;
} }
static void
free_owned_register(gpointer data, gpointer user_data _U_)
{
fvalue_free(data);
}
/* Clear registers that were populated during evaluation. /* Clear registers that were populated during evaluation.
* If we created the values, then these will be freed as well. */ * If we created the values, then these will be freed as well. */
static void static void
@ -502,9 +495,11 @@ free_register_overhead(dfilter_t* df)
for (i = 0; i < df->num_registers; i++) { for (i = 0; i < df->num_registers; i++) {
df->attempted_load[i] = FALSE; df->attempted_load[i] = FALSE;
if (df->registers[i]) { if (df->registers[i]) {
if (df->owns_memory[i]) { if (df->free_registers[i]) {
g_slist_foreach(df->registers[i], free_owned_register, NULL); for (GSList *l = df->registers[i]; l != NULL; l = l->next) {
df->owns_memory[i] = FALSE; df->free_registers[i](l->data);
}
df->free_registers[i] = NULL;
} }
g_slist_free(df->registers[i]); g_slist_free(df->registers[i]);
df->registers[i] = NULL; df->registers[i] = NULL;
@ -539,7 +534,7 @@ mk_range(dfilter_t *df, dfvm_value_t *from_arg, dfvm_value_t *to_arg,
} }
df->registers[to_arg->value.numeric] = to_list; df->registers[to_arg->value.numeric] = to_list;
df->owns_memory[to_arg->value.numeric] = TRUE; df->free_registers[to_arg->value.numeric] = (GDestroyNotify)fvalue_free;
} }
static gboolean static gboolean
@ -563,7 +558,7 @@ call_function(dfilter_t *df, dfvm_value_t *arg1, dfvm_value_t *arg2,
df->registers[arg2->value.numeric] = retval; df->registers[arg2->value.numeric] = retval;
// functions create a new value, so own it. // functions create a new value, so own it.
df->owns_memory[arg2->value.numeric] = TRUE; df->free_registers[arg2->value.numeric] = (GDestroyNotify)fvalue_free;
return accum; return accum;
} }