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>
This commit is contained in:
Stig Bjørlykke 2016-04-09 14:30:07 +02:00
parent 76adb4c044
commit 5112d1ec27
4 changed files with 26 additions and 13 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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
*

6
file.c
View File

@ -1630,6 +1630,12 @@ rescan_packets(capture_file *cf, const char *action, const char *action_item, gb
cf->epan = ws_epan_new(cf);
cf->cinfo.epan = cf->epan;
/* A new Lua tap listener may be registered in lua_prime_all_fields()
called via epan_new() / init_dissection() when reloading Lua plugins. */
if (!create_proto_tree && have_filtering_tap_listeners()) {
create_proto_tree = TRUE;
}
/* We need to redissect the packets so we have to discard our old
* packet list store. */
packet_list_clear();