forked from osmocom/wireshark
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:
parent
76adb4c044
commit
5112d1ec27
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
6
file.c
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue