Recompile dfilter for all tap listeners when fields changed
authorStig Bjørlykke <stig@bjorlykke.org>
Wed, 19 Aug 2015 07:00:54 +0000 (09:00 +0200)
committerStig Bjørlykke <stig@bjorlykke.org>
Wed, 19 Aug 2015 08:55:19 +0000 (08:55 +0000)
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 <stig@bjorlykke.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
epan/tap.c
epan/tap.h
ui/qt/main_window_slots.cpp

index c0b7f92c2f4a93364f3ea9181f444872340fa8b1..d1e68fd73e55777f43a59caee6cd5f98217aa8a9 100644 (file)
@@ -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);
        }
 
index 7f2002af17d4c11126f13fbf4f18bfcb7418a28a..c3b427f00843134c32946a29ff89e9baf607f764 100644 (file)
@@ -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);
 
index a98a84cba9e50ac97b1216a8a69c1ffe12115c26..fd7a1817ac59f7f89f4ba30db88fe1d38268391e 100644 (file)
@@ -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);