From 5a8a7077f114d0f56601136c7d320a40494e928d Mon Sep 17 00:00:00 2001 From: John Thacker Date: Sat, 25 May 2024 23:35:59 -0400 Subject: lua: Fix leaks when reloading plugins If any of the static GPtrArrays have been created, unref the current one before creating a new one. --- epan/wslua/wslua_column.c | 6 ++++++ epan/wslua/wslua_dumper.c | 3 +++ epan/wslua/wslua_field.c | 6 ++++++ epan/wslua/wslua_pinfo.c | 6 ++++++ epan/wslua/wslua_proto.c | 3 +++ epan/wslua/wslua_tree.c | 3 +++ epan/wslua/wslua_tvb.c | 6 ++++++ 7 files changed, 33 insertions(+) diff --git a/epan/wslua/wslua_column.c b/epan/wslua/wslua_column.c index 05c4450977..5d75657c47 100644 --- a/epan/wslua/wslua_column.c +++ b/epan/wslua/wslua_column.c @@ -238,6 +238,9 @@ WSLUA_META Column_meta[] = { int Column_register(lua_State *L) { WSLUA_REGISTER_CLASS(Column); + if (outstanding_Column != NULL) { + g_ptr_array_unref(outstanding_Column); + } outstanding_Column = g_ptr_array_new(); return 0; } @@ -415,6 +418,9 @@ WSLUA_META Columns_meta[] = { int Columns_register(lua_State *L) { WSLUA_REGISTER_META(Columns); + if (outstanding_Columns != NULL) { + g_ptr_array_unref(outstanding_Columns); + } outstanding_Columns = g_ptr_array_new(); return 0; } diff --git a/epan/wslua/wslua_dumper.c b/epan/wslua/wslua_dumper.c index a98d4b9f23..9ece6518f8 100644 --- a/epan/wslua/wslua_dumper.c +++ b/epan/wslua/wslua_dumper.c @@ -615,6 +615,9 @@ WSLUA_META Dumper_meta[] = { }; int Dumper_register(lua_State* L) { + if (dumper_encaps != NULL) { + g_hash_table_unref(dumper_encaps); + } dumper_encaps = g_hash_table_new(g_direct_hash,g_direct_equal); WSLUA_REGISTER_CLASS(Dumper); return 0; diff --git a/epan/wslua/wslua_field.c b/epan/wslua/wslua_field.c index 4c0bde97cc..26ee9a45a4 100644 --- a/epan/wslua/wslua_field.c +++ b/epan/wslua/wslua_field.c @@ -766,9 +766,15 @@ WSLUA_META Field_meta[] = { int Field_register(lua_State* L) { + if (wanted_fields != NULL) { + g_ptr_array_unref(wanted_fields); + } wanted_fields = g_ptr_array_new(); WSLUA_REGISTER_CLASS_WITH_ATTRS(Field); + if (outstanding_FieldInfo != NULL) { + g_ptr_array_unref(outstanding_FieldInfo); + } outstanding_FieldInfo = g_ptr_array_new(); return 0; diff --git a/epan/wslua/wslua_pinfo.c b/epan/wslua/wslua_pinfo.c index 2d1a7afcbd..2a2de107bc 100644 --- a/epan/wslua/wslua_pinfo.c +++ b/epan/wslua/wslua_pinfo.c @@ -477,7 +477,13 @@ WSLUA_META Pinfo_meta[] = { int Pinfo_register(lua_State* L) { WSLUA_REGISTER_META_WITH_ATTRS(Pinfo); + if (outstanding_Pinfo != NULL) { + g_ptr_array_unref(outstanding_Pinfo); + } outstanding_Pinfo = g_ptr_array_new(); + if (outstanding_PrivateTable != NULL) { + g_ptr_array_unref(outstanding_PrivateTable); + } outstanding_PrivateTable = g_ptr_array_new(); return 0; } diff --git a/epan/wslua/wslua_proto.c b/epan/wslua/wslua_proto.c index d63867c75f..17238f5d58 100644 --- a/epan/wslua/wslua_proto.c +++ b/epan/wslua/wslua_proto.c @@ -572,6 +572,9 @@ WSLUA_META Proto_meta[] = { int Proto_register(lua_State* L) { WSLUA_REGISTER_CLASS_WITH_ATTRS(Proto); + if (outstanding_FuncSavers != NULL) { + g_ptr_array_unref(outstanding_FuncSavers); + } outstanding_FuncSavers = g_ptr_array_new(); lua_newtable(L); diff --git a/epan/wslua/wslua_tree.c b/epan/wslua/wslua_tree.c index 126bdb1a25..8a890a0d64 100644 --- a/epan/wslua/wslua_tree.c +++ b/epan/wslua/wslua_tree.c @@ -1169,6 +1169,9 @@ int TreeItem_register(lua_State *L) { int* etts[] = { &wslua_ett }; wslua_ett = -1; /* Reset to support reload Lua plugins */ WSLUA_REGISTER_CLASS_WITH_ATTRS(TreeItem); + if (outstanding_TreeItem != NULL) { + g_ptr_array_unref(outstanding_TreeItem); + } outstanding_TreeItem = g_ptr_array_new(); proto_register_subtree_array(etts,1); return 0; diff --git a/epan/wslua/wslua_tvb.c b/epan/wslua/wslua_tvb.c index 4059b43714..15a3ca5fce 100644 --- a/epan/wslua/wslua_tvb.c +++ b/epan/wslua/wslua_tvb.c @@ -321,6 +321,9 @@ WSLUA_META Tvb_meta[] = { int Tvb_register(lua_State* L) { WSLUA_REGISTER_CLASS(Tvb); + if (outstanding_Tvb != NULL) { + g_ptr_array_unref(outstanding_Tvb); + } outstanding_Tvb = g_ptr_array_new(); return 0; } @@ -1475,6 +1478,9 @@ WSLUA_META TvbRange_meta[] = { }; int TvbRange_register(lua_State* L) { + if (outstanding_TvbRange != NULL) { + g_ptr_array_unref(outstanding_TvbRange); + } outstanding_TvbRange = g_ptr_array_new(); WSLUA_REGISTER_CLASS(TvbRange); return 0; -- cgit v1.2.3