forked from osmocom/wireshark
![Darius Davis](/assets/img/avatar_default.png)
filter_expression_new was g_strdup()ing each of the strings in the "expression" structure, but UAT is just going to immediately deep copy the structure (via display_filter_copy_cb), so the copies made here are immediately leaking. We could either free() these copies immediately after uat_add_record returns, or skip the g_strdup altogether (which necessitates casting away the "const"). I chose the latter. Testing Done: Linux x64 build. With a display filter configured in ~/.wireshark/preferences, Valgrind no longer reports three leaks from here. Change-Id: I7913f260875ced597b9027c8ae92a4d6d44f6414 Reviewed-on: https://code.wireshark.org/review/27157 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu <peter@lekensteyn.nl>
132 lines
4.1 KiB
C
132 lines
4.1 KiB
C
/* filter_expressions.c
|
|
* Submitted by Edwin Groothuis <wireshark@mavetju.org>
|
|
*
|
|
* Wireshark - Network traffic analyzer
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
* Copyright 1998 Gerald Combs
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <glib.h>
|
|
|
|
#include <epan/prefs.h>
|
|
#include <epan/uat.h>
|
|
#include <epan/uat-int.h>
|
|
|
|
#include "epan/filter_expressions.h"
|
|
|
|
/* UAT variables */
|
|
static uat_t *display_filter_macro_uat = NULL;
|
|
static filter_expression_t *display_filter_macros = NULL;
|
|
static guint num_display_filter_macros = 0;
|
|
|
|
/* Field callbacks. */
|
|
UAT_BOOL_CB_DEF(display_filter_macro_uat, enabled, filter_expression_t)
|
|
UAT_CSTRING_CB_DEF(display_filter_macro_uat, label, filter_expression_t)
|
|
UAT_DISPLAY_FILTER_CB_DEF(display_filter_macro_uat, expression, filter_expression_t)
|
|
UAT_CSTRING_CB_DEF(display_filter_macro_uat, comment, filter_expression_t)
|
|
|
|
/*
|
|
* Create a new filter_expression and add it to the end of the list
|
|
* of filter_expressions.
|
|
*/
|
|
filter_expression_t*
|
|
filter_expression_new(const gchar *label, const gchar *expr,
|
|
const gchar *comment, const gboolean enabled)
|
|
{
|
|
filter_expression_t expression;
|
|
|
|
// UAT allocates its own memory and then deep-copies this structure in.
|
|
memset(&expression, 0, sizeof(expression));
|
|
expression.label = (gchar *)label;
|
|
expression.expression = (gchar *)expr;
|
|
expression.comment = (gchar *)comment;
|
|
expression.enabled = enabled;
|
|
|
|
/* XXX - This is just returned to make GTK GUI work. */
|
|
return (filter_expression_t*)uat_add_record(display_filter_macro_uat, &expression, TRUE);
|
|
}
|
|
|
|
void filter_expression_iterate_expressions(wmem_foreach_func func, void* user_data)
|
|
{
|
|
guint i;
|
|
|
|
for (i = 0; i < num_display_filter_macros; i++)
|
|
{
|
|
func(NULL, &display_filter_macros[i], user_data);
|
|
}
|
|
}
|
|
|
|
static void display_filter_free_cb(void*r) {
|
|
filter_expression_t* rec = (filter_expression_t*)r;
|
|
|
|
g_free(rec->label);
|
|
g_free(rec->expression);
|
|
g_free(rec->comment);
|
|
}
|
|
|
|
static void* display_filter_copy_cb(void* n, const void* o, size_t siz _U_) {
|
|
filter_expression_t* new_record = (filter_expression_t*)n;
|
|
const filter_expression_t* old_record = (const filter_expression_t*)o;
|
|
|
|
new_record->label = g_strdup(old_record->label);
|
|
new_record->expression = g_strdup(old_record->expression);
|
|
new_record->comment = g_strdup(old_record->comment);
|
|
|
|
new_record->enabled = old_record->enabled;
|
|
|
|
return new_record;
|
|
}
|
|
|
|
static uat_field_t display_filter_uat_flds[] = {
|
|
UAT_FLD_BOOL(display_filter_macro_uat, enabled, "Show in toolbar",
|
|
"Checked to add display filter button to toolbar"),
|
|
UAT_FLD_CSTRING(display_filter_macro_uat, label, "Button Label",
|
|
"Name of the display filter button"),
|
|
UAT_FLD_DISPLAY_FILTER(display_filter_macro_uat, expression, "Filter Expression",
|
|
"Filter expression to be applied by the button"),
|
|
UAT_FLD_CSTRING(display_filter_macro_uat, comment, "Comment",
|
|
"Comment describing filter expression"),
|
|
UAT_END_FIELDS
|
|
};
|
|
|
|
void filter_expression_register_uat(module_t* pref_module)
|
|
{
|
|
display_filter_macro_uat = uat_new("Display expressions",
|
|
sizeof(filter_expression_t), /* record size */
|
|
"dfilter_buttons", /* filename */
|
|
TRUE, /* from_profile */
|
|
&display_filter_macros, /* data_ptr */
|
|
&num_display_filter_macros, /* numitems_ptr */
|
|
0, /* Doesn't not explicitly effect dissection */
|
|
NULL, /* help */
|
|
display_filter_copy_cb, /* copy callback */
|
|
NULL, /* update callback */
|
|
display_filter_free_cb, /* free callback */
|
|
NULL, /* post update callback */
|
|
NULL, /* reset callback */
|
|
display_filter_uat_flds); /* UAT field definitions */
|
|
|
|
prefs_register_uat_preference(pref_module, "expressions",
|
|
"Display filter expressions",
|
|
"Macros for display filters",
|
|
display_filter_macro_uat);
|
|
}
|
|
|
|
|
|
/*
|
|
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
*
|
|
* Local variables:
|
|
* c-basic-offset: 8
|
|
* tab-width: 8
|
|
* indent-tabs-mode: t
|
|
* End:
|
|
*
|
|
* vi: set shiftwidth=8 tabstop=8 noexpandtab:
|
|
* :indentSize=8:tabSize=8:noTabs=false:
|
|
*/
|