From fa40025a7e2e9ddc5590515989074df1662dcc82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20Bj=C3=B8rlykke?= Date: Wed, 19 Aug 2015 09:00:54 +0200 Subject: [PATCH] Recompile dfilter for all tap listeners when fields changed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When fields have changed the compiled display filter may be invalid or need a recompile to be valid. Filters which are not valid after a recompile is set to a filter matching no packets (frame.number == 0) to indicate that this does no longer match anything. We should probably have a better filter matching no packet for this purpose. Change-Id: Id27efa9f46e77e20df50d7366f26d5cada186f93 Reviewed-on: https://code.wireshark.org/review/10123 Petri-Dish: Stig Bjørlykke Tested-by: Petri Dish Buildbot Reviewed-by: Stig Bjørlykke --- epan/tap.c | 30 ++++++++++++++++++++++++++++++ epan/tap.h | 3 +++ ui/qt/main_window_slots.cpp | 1 + 3 files changed, 34 insertions(+) diff --git a/epan/tap.c b/epan/tap.c index c0b7f92c2f..d1e68fd73e 100644 --- a/epan/tap.c +++ b/epan/tap.c @@ -93,6 +93,7 @@ typedef struct _tap_listener_t { int tap_id; gboolean needs_redraw; guint flags; + gchar *fstring; dfilter_t *code; void *tapdata; tap_reset_cb reset; @@ -529,6 +530,7 @@ register_tap_listener(const char *tapname, void *tapdata, const char *fstring, return error_string; } } + tl->fstring=g_strdup(fstring); tl->tap_id=tap_id; tl->tapdata=tapdata; @@ -573,8 +575,10 @@ set_tap_dfilter(void *tapdata, const char *fstring) tl->code=NULL; } tl->needs_redraw=TRUE; + g_free(tl->fstring); if(fstring){ if(!dfilter_compile(fstring, &tl->code, &err_msg)){ + tl->fstring=NULL; error_string = g_string_new(""); g_string_printf(error_string, "Filter \"%s\" is invalid - %s", @@ -583,11 +587,36 @@ set_tap_dfilter(void *tapdata, const char *fstring) return error_string; } } + tl->fstring=g_strdup(fstring); } return NULL; } +/* this function recompiles dfilter for all registered tap listeners + */ +void +tap_listeners_dfilter_recompile(void) +{ + tap_listener_t *tl; + gchar *err_msg; + + for(tl=(tap_listener_t *)tap_listener_queue;tl;tl=tl->next){ + if(tl->code){ + dfilter_free(tl->code); + tl->code=NULL; + } + tl->needs_redraw=TRUE; + if(tl->fstring){ + if(!dfilter_compile(tl->fstring, &tl->code, &err_msg)){ + g_free(err_msg); + /* Not valid, make a dfilter matching no packets */ + dfilter_compile("frame.number == 0", &tl->code, &err_msg); + } + } + } +} + /* this function removes a tap listener */ void @@ -617,6 +646,7 @@ remove_tap_listener(void *tapdata) if(tl->code){ dfilter_free(tl->code); } + g_free(tl->fstring); g_free(tl); } diff --git a/epan/tap.h b/epan/tap.h index 7f2002af17..c3b427f008 100644 --- a/epan/tap.h +++ b/epan/tap.h @@ -218,6 +218,9 @@ WS_DLL_PUBLIC GString *register_tap_listener(const char *tapname, void *tapdata, /** This function sets a new dfilter to a tap listener */ WS_DLL_PUBLIC GString *set_tap_dfilter(void *tapdata, const char *fstring); +/** This function recompiles dfilter for all registered tap listeners */ +WS_DLL_PUBLIC void tap_listeners_dfilter_recompile(void); + /** this function removes a tap listener */ WS_DLL_PUBLIC void remove_tap_listener(void *tapdata); diff --git a/ui/qt/main_window_slots.cpp b/ui/qt/main_window_slots.cpp index a98a84cba9..fd7a1817ac 100644 --- a/ui/qt/main_window_slots.cpp +++ b/ui/qt/main_window_slots.cpp @@ -1308,6 +1308,7 @@ void MainWindow::redissectPackets() void MainWindow::fieldsChanged() { color_filters_reload(); + tap_listeners_dfilter_recompile(); if (!df_combo_box_->checkDisplayFilter()) { g_free(CaptureFile::globalCapFile()->dfilter);