diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2016-04-09 14:30:07 +0200 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2016-04-11 17:59:11 +0000 |
commit | 5112d1ec27e0b37fe4194fbc627877e28c027261 (patch) | |
tree | eedf66594271057d7b93fa552af298e972d13647 /epan/wslua | |
parent | 76adb4c044fca4b56346a01d655a04bf56fe770c (diff) |
Lua: Fix add and remove Fields when reload Lua plugins
Reset wslua_dfilter and remove the Field tap_listener when
reloading plugins.
Check for tap listeners in rescan_packets() after ws_epan_new()
because Lua may register the Lua field tap when adding Fields.
Bug: 12328
Change-Id: Ibbd8339033132c6f3b61d7e9c9ced9ed2b9affec
Reviewed-on: https://code.wireshark.org/review/14871
Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
Diffstat (limited to 'epan/wslua')
-rw-r--r-- | epan/wslua/init_wslua.c | 1 | ||||
-rw-r--r-- | epan/wslua/wslua.h | 1 | ||||
-rw-r--r-- | epan/wslua/wslua_field.c | 31 |
3 files changed, 20 insertions, 13 deletions
diff --git a/epan/wslua/init_wslua.c b/epan/wslua/init_wslua.c index 4a8ff1fb44..cd71e2a5d6 100644 --- a/epan/wslua/init_wslua.c +++ b/epan/wslua/init_wslua.c @@ -991,6 +991,7 @@ void wslua_reload_plugins (register_cb cb, gpointer client_data) { wslua_deregister_protocols(L); wslua_deregister_dissector_tables(L); wslua_deregister_listeners(L); + wslua_deregister_fields(L); wslua_deregister_filehandlers(L); wslua_deregister_menus(); wslua_clear_plugin_list(); diff --git a/epan/wslua/wslua.h b/epan/wslua/wslua.h index aee0abfda8..fb067a2f38 100644 --- a/epan/wslua/wslua.h +++ b/epan/wslua/wslua.h @@ -787,6 +787,7 @@ extern int wslua_deregister_heur_dissectors(lua_State* L); extern int wslua_deregister_protocols(lua_State* L); extern int wslua_deregister_dissector_tables(lua_State* L); extern int wslua_deregister_listeners(lua_State* L); +extern int wslua_deregister_fields(lua_State* L); extern int wslua_deregister_filehandlers(lua_State* L); extern void wslua_deregister_menus(void); diff --git a/epan/wslua/wslua_field.c b/epan/wslua/wslua_field.c index 7a52585952..0dc79760a3 100644 --- a/epan/wslua/wslua_field.c +++ b/epan/wslua/wslua_field.c @@ -557,10 +557,10 @@ gboolean wslua_has_field_extractors(void) { * after the fields are primed. */ +static gboolean fake_tap = FALSE; void lua_prime_all_fields(proto_tree* tree _U_) { GString* fake_tap_filter = g_string_new("frame"); guint i; - static gboolean fake_tap = FALSE; gchar *err_msg; for(i=0; i < wanted_fields->len; i++) { @@ -596,19 +596,10 @@ void lua_prime_all_fields(proto_tree* tree _U_) { if (error) { report_failure("while registering lua_fake_tap:\n%s",error->str); g_string_free(error,TRUE); - } else { - if (wslua_dfilter) { - dfilter_free(wslua_dfilter); - wslua_dfilter = NULL; - } - if (!dfilter_compile(fake_tap_filter->str, &wslua_dfilter, &err_msg)) { - report_failure("while compiling dfilter \"%s\" for wslua: %s", fake_tap_filter->str, err_msg); - g_free(err_msg); - } + } else if (!dfilter_compile(fake_tap_filter->str, &wslua_dfilter, &err_msg)) { + report_failure("while compiling dfilter \"%s\" for wslua: %s", fake_tap_filter->str, err_msg); + g_free(err_msg); } - } else if (fake_tap) { - remove_tap_listener(&fake_tap); - fake_tap = FALSE; } g_string_free(fake_tap_filter, TRUE); } @@ -819,6 +810,20 @@ int Field_register(lua_State* L) { return 0; } +int wslua_deregister_fields(lua_State* L _U_) { + if (wslua_dfilter) { + dfilter_free(wslua_dfilter); + wslua_dfilter = NULL; + } + + if (fake_tap) { + remove_tap_listener(&fake_tap); + fake_tap = FALSE; + } + + return 0; +} + /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * |