aboutsummaryrefslogtreecommitdiffstats
path: root/ui/gtk/main.c
diff options
context:
space:
mode:
authorStig Bjørlykke <stig@bjorlykke.org>2014-11-06 11:19:25 +0100
committerStig Bjørlykke <stig@bjorlykke.org>2014-11-10 08:01:12 +0000
commitea167053ffc553b3a5f4ce6cbe0b78ecc8cd0dbe (patch)
treeceac2e98230e01eaf207a51ab98bd57afdddcead /ui/gtk/main.c
parentd58567bd78abc1903191c9a955365b8d41f09496 (diff)
Improved deregistering fields.
This improvement avoids use of deallocated memory (crash) if using a deregistered field in display filter, color filter, custom column and other cases when the field is used as "interesting field". This functionality is currently used in http, imf and ldap preferences. Also removed unused proto_registrar_n() as this does not work correctly after deregistering fields. Change-Id: I043e3bf7a98bd773c9801e712a012d1eab8a7f94 Reviewed-on: https://code.wireshark.org/review/5161 Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'ui/gtk/main.c')
-rw-r--r--ui/gtk/main.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/ui/gtk/main.c b/ui/gtk/main.c
index 187f954c51..058418d1fc 100644
--- a/ui/gtk/main.c
+++ b/ui/gtk/main.c
@@ -69,6 +69,7 @@
#include <epan/column.h>
#include <epan/disabled_protos.h>
#include <epan/epan.h>
+#include <epan/proto.h>
#include <epan/epan_dissect.h>
#include <epan/dfilter/dfilter.h>
#include <epan/strutil.h>
@@ -3823,6 +3824,38 @@ void change_configuration_profile (const gchar *profile_name)
main_pane_load_window_geometry();
}
+void
+main_fields_changed (void)
+{
+ /* Reload color filters */
+ color_filters_reload();
+
+ /* Syntax check filter */
+ filter_te_syntax_check_cb(main_display_filter_widget, NULL);
+ if (cfile.dfilter) {
+ /* Check if filter is still valid */
+ dfilter_t *dfp = NULL;
+ if (!dfilter_compile(cfile.dfilter, &dfp)) {
+ /* Not valid. Enable 'Apply' button and remove dfilter. */
+ g_signal_emit_by_name(G_OBJECT(main_display_filter_widget), "changed");
+ g_free(cfile.dfilter);
+ cfile.dfilter = NULL;
+ }
+ dfilter_free(dfp);
+ }
+
+ if (have_custom_cols(&cfile.cinfo)) {
+ /* Recreate packet list according to new/changed/deleted fields */
+ packet_list_recreate();
+ } else if (cfile.state != FILE_CLOSED) {
+ /* Redissect packets if we have any */
+ redissect_packets();
+ }
+ destroy_packet_wins(); /* TODO: close windows until we can recreate */
+
+ proto_free_deregistered_fields();
+}
+
/** redissect packets and update UI */
void redissect_packets(void)
{