forked from osmocom/wireshark
dfilter: Use a function pointer array to free registers
This commit is contained in:
parent
89a39134ff
commit
631cf34f0c
|
@ -22,7 +22,7 @@ struct epan_dfilter {
|
|||
guint num_registers;
|
||||
GSList **registers;
|
||||
gboolean *attempted_load;
|
||||
gboolean *owns_memory;
|
||||
GDestroyNotify *free_registers;
|
||||
int *interesting_fields;
|
||||
int num_interesting_fields;
|
||||
GPtrArray *deprecated;
|
||||
|
|
|
@ -204,7 +204,7 @@ dfilter_free(dfilter_t *df)
|
|||
|
||||
g_free(df->registers);
|
||||
g_free(df->attempted_load);
|
||||
g_free(df->owns_memory);
|
||||
g_free(df->free_registers);
|
||||
g_free(df);
|
||||
}
|
||||
|
||||
|
@ -447,7 +447,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
|
|||
dfilter->num_registers = dfw->next_register;
|
||||
dfilter->registers = g_new0(GSList *, 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. */
|
||||
*dfp = dfilter;
|
||||
|
|
|
@ -370,7 +370,7 @@ read_tree(dfilter_t *df, proto_tree *tree,
|
|||
|
||||
df->registers[reg] = fvalues;
|
||||
// These values are referenced only, do not try to free it later.
|
||||
df->owns_memory[reg] = FALSE;
|
||||
df->free_registers[reg] = NULL;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -485,13 +485,6 @@ any_in_range(dfilter_t *df, dfvm_value_t *arg1,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_owned_register(gpointer data, gpointer user_data _U_)
|
||||
{
|
||||
fvalue_free(data);
|
||||
}
|
||||
|
||||
/* Clear registers that were populated during evaluation.
|
||||
* If we created the values, then these will be freed as well. */
|
||||
static void
|
||||
|
@ -502,9 +495,11 @@ free_register_overhead(dfilter_t* df)
|
|||
for (i = 0; i < df->num_registers; i++) {
|
||||
df->attempted_load[i] = FALSE;
|
||||
if (df->registers[i]) {
|
||||
if (df->owns_memory[i]) {
|
||||
g_slist_foreach(df->registers[i], free_owned_register, NULL);
|
||||
df->owns_memory[i] = FALSE;
|
||||
if (df->free_registers[i]) {
|
||||
for (GSList *l = df->registers[i]; l != NULL; l = l->next) {
|
||||
df->free_registers[i](l->data);
|
||||
}
|
||||
df->free_registers[i] = NULL;
|
||||
}
|
||||
g_slist_free(df->registers[i]);
|
||||
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->owns_memory[to_arg->value.numeric] = TRUE;
|
||||
df->free_registers[to_arg->value.numeric] = (GDestroyNotify)fvalue_free;
|
||||
}
|
||||
|
||||
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;
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue