diff --git a/NEWS b/NEWS index 0a049f94c7..bd056bc781 100644 --- a/NEWS +++ b/NEWS @@ -50,6 +50,9 @@ Deprecated Functionality - ``LogAscii::logdir`` and per-writer log directories have been deprecated in favor of the new ``Log::default_logdir``. +- The HOOK_BRO_OBJ_DTOR hook and associated methods have been deprecated. They + are replaced by the HOOK_OBJ_DTOR hook and methods. + Zeek 5.0.0 ========== diff --git a/src/Obj.cc b/src/Obj.cc index 8b4fffaa7e..fd1b9100aa 100644 --- a/src/Obj.cc +++ b/src/Obj.cc @@ -60,7 +60,13 @@ int Obj::suppress_errors = 0; Obj::~Obj() { if ( notify_plugins ) + { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" PLUGIN_HOOK_VOID(HOOK_BRO_OBJ_DTOR, HookBroObjDtor(this)); +#pragma GCC diagnostic pop + PLUGIN_HOOK_VOID(HOOK_OBJ_DTOR, HookObjDtor(this)); + } delete location; } diff --git a/src/plugin/Manager.cc b/src/plugin/Manager.cc index ff044ddbe2..433a9dc740 100644 --- a/src/plugin/Manager.cc +++ b/src/plugin/Manager.cc @@ -669,6 +669,11 @@ void Manager::RequestBroObjDtor(Obj* obj, Plugin* plugin) obj->NotifyPluginsOnDtor(); } +void Manager::RequestObjDtor(Obj* obj, Plugin* plugin) + { + obj->NotifyPluginsOnDtor(); + } + int Manager::HookLoadFile(const Plugin::LoadType type, const string& file, const string& resolved) { HookArgumentList args; @@ -905,6 +910,29 @@ void Manager::HookBroObjDtor(void* obj) const MetaHookPost(HOOK_BRO_OBJ_DTOR, args, HookArgument()); } +void Manager::HookObjDtor(void* obj) const + { + HookArgumentList args; + + if ( HavePluginForHook(META_HOOK_PRE) ) + { + args.push_back(HookArgument(obj)); + MetaHookPre(HOOK_OBJ_DTOR, args); + } + + hook_list* l = hooks[HOOK_OBJ_DTOR]; + + if ( l ) + for ( hook_list::iterator i = l->begin(); i != l->end(); ++i ) + { + Plugin* p = (*i).second; + p->HookObjDtor(obj); + } + + if ( HavePluginForHook(META_HOOK_POST) ) + MetaHookPost(HOOK_OBJ_DTOR, args, HookArgument()); + } + void Manager::HookLogInit(const std::string& writer, const std::string& instantiating_filter, bool local, bool remote, const logging::WriterBackend::WriterInfo& info, int num_fields, const threading::Field* const* fields) const diff --git a/src/plugin/Manager.h b/src/plugin/Manager.h index b2a0158d4c..c3fcc287fc 100644 --- a/src/plugin/Manager.h +++ b/src/plugin/Manager.h @@ -226,7 +226,19 @@ public: * * @param plugin The plugin expressing interest. */ - void RequestBroObjDtor(Obj* obj, Plugin* plugin); + [[deprecated("Remove in v6.1. Use RequestObjDtor.")]] void RequestBroObjDtor(Obj* obj, + Plugin* plugin); + + /** + * Register interest in the destruction of a Obj instance. When Zeek's + * reference counting triggers the objects destructor to run, the \a + * HookObjDtor will be called. + * + * @param handler The object being interested in. + * + * @param plugin The plugin expressing interest. + */ + void RequestObjDtor(Obj* obj, Plugin* plugin); // Hook entry functions. @@ -321,10 +333,16 @@ public: void HookDrainEvents() const; /** - * Hook that informs plugins that an BroObj is being destroyed. Will be + * Hook that informs plugins that an Obj is being destroyed. Will be * called only for objects that a plugin has expressed interest in. */ - void HookBroObjDtor(void* obj) const; + [[deprecated("Remove in v6.1. Use HookObjDtor.")]] void HookBroObjDtor(void* obj) const; + + /** + * Hook that informs plugins that an Obj is being destroyed. Will be + * called only for objects that a plugin has expressed interest in. + */ + void HookObjDtor(void* obj) const; /** * Hook into log initialization. This method will be called when a diff --git a/src/plugin/Plugin.cc b/src/plugin/Plugin.cc index 771984c9d2..52594255ee 100644 --- a/src/plugin/Plugin.cc +++ b/src/plugin/Plugin.cc @@ -33,6 +33,7 @@ const char* hook_name(HookType h) "LogWrite", "Reporter", "UnprocessedPacket", + "ObjDtor", // MetaHooks "MetaHookPre", "MetaHookPost", @@ -385,6 +386,11 @@ void Plugin::RequestBroObjDtor(Obj* obj) plugin_mgr->RequestBroObjDtor(obj, this); } +void Plugin::RequestObjDtor(Obj* obj) + { + plugin_mgr->RequestObjDtor(obj, this); + } + int Plugin::HookLoadFile(const LoadType type, const std::string& file, const std::string& resolved) { return -1; @@ -416,6 +422,8 @@ void Plugin::HookSetupAnalyzerTree(Connection* conn) { } void Plugin::HookBroObjDtor(void* obj) { } +void Plugin::HookObjDtor(void* obj) { } + void Plugin::HookLogInit(const std::string& writer, const std::string& instantiating_filter, bool local, bool remote, const logging::WriterBackend::WriterInfo& info, int num_fields, const threading::Field* const* fields) diff --git a/src/plugin/Plugin.h b/src/plugin/Plugin.h index 068bf4db6b..c4f4f901a8 100644 --- a/src/plugin/Plugin.h +++ b/src/plugin/Plugin.h @@ -62,14 +62,15 @@ enum HookType HOOK_LOAD_FILE_EXT, //< Activates Plugin::HookLoadFileExtended(). HOOK_CALL_FUNCTION, //< Activates Plugin::HookCallFunction(). HOOK_QUEUE_EVENT, //< Activates Plugin::HookQueueEvent(). - HOOK_DRAIN_EVENTS, //< Activates Plugin::HookDrainEvents() - HOOK_UPDATE_NETWORK_TIME, //< Activates Plugin::HookUpdateNetworkTime. - HOOK_BRO_OBJ_DTOR, //< Activates Plugin::HookBroObjDtor. - HOOK_SETUP_ANALYZER_TREE, //< Activates Plugin::HookAddToAnalyzerTree - HOOK_LOG_INIT, //< Activates Plugin::HookLogInit - HOOK_LOG_WRITE, //< Activates Plugin::HookLogWrite - HOOK_REPORTER, //< Activates Plugin::HookReporter - HOOK_UNPROCESSED_PACKET, //, ( XXXXXXXXXX.XXXXXX MetaHookPost CallFunction(get_net_stats, , ()) -> XXXXXXXXXX.XXXXXX MetaHookPost CallFunction(new_connection, , ([id=[orig_h=141.142.228.5, orig_p=59856/tcp, resp_h=192.150.187.43, resp_p=80/tcp], orig=[size=0, state=0, num_pkts=0, num_bytes_ip=0, flow_label=0, l2_addr=c8:bc:c8:96:d2:a0], resp=[size=0, state=0, num_pkts=0, num_bytes_ip=0, flow_label=0, l2_addr=00:10:db:88:d2:ef], start_time=XXXXXXXXXX.XXXXXX, duration=0 secs, service={}, history=, uid=CHhAvVGS1DHFjwGM9, tunnel=, vlan=, inner_vlan=, dpd=, dpd_state=, removal_hooks=, conn=, extract_orig=F, extract_resp=F, thresholds=, dce_rpc=, dce_rpc_state=, dce_rpc_backing=, dhcp=, dnp3=, dns=, dns_state=, ftp=, ftp_data_reuse=F, ssl=, http=, http_state=, irc=, krb=, modbus=, mysql=, ntlm=, ntp=, radius=, rdp=, rfb=, sip=, sip_state=, snmp=, smb_state=, smtp=, smtp_state=, socks=, ssh=, syslog=])) -> XXXXXXXXXX.XXXXXX MetaHookPost DrainEvents() -> +XXXXXXXXXX.XXXXXX MetaHookPost ObjDtor() -> XXXXXXXXXX.XXXXXX MetaHookPost QueueEvent(Broker::log_flush()) -> false XXXXXXXXXX.XXXXXX MetaHookPost QueueEvent(ChecksumOffloading::check()) -> false XXXXXXXXXX.XXXXXX MetaHookPost QueueEvent(filter_change_tracking()) -> false @@ -4462,6 +4463,7 @@ XXXXXXXXXX.XXXXXX MetaHookPre CallFunction(filter_change_tracking, , ( XXXXXXXXXX.XXXXXX MetaHookPre CallFunction(get_net_stats, , ()) XXXXXXXXXX.XXXXXX MetaHookPre CallFunction(new_connection, , ([id=[orig_h=141.142.228.5, orig_p=59856/tcp, resp_h=192.150.187.43, resp_p=80/tcp], orig=[size=0, state=0, num_pkts=0, num_bytes_ip=0, flow_label=0, l2_addr=c8:bc:c8:96:d2:a0], resp=[size=0, state=0, num_pkts=0, num_bytes_ip=0, flow_label=0, l2_addr=00:10:db:88:d2:ef], start_time=XXXXXXXXXX.XXXXXX, duration=0 secs, service={}, history=, uid=CHhAvVGS1DHFjwGM9, tunnel=, vlan=, inner_vlan=, dpd=, dpd_state=, removal_hooks=, conn=, extract_orig=F, extract_resp=F, thresholds=, dce_rpc=, dce_rpc_state=, dce_rpc_backing=, dhcp=, dnp3=, dns=, dns_state=, ftp=, ftp_data_reuse=F, ssl=, http=, http_state=, irc=, krb=, modbus=, mysql=, ntlm=, ntp=, radius=, rdp=, rfb=, sip=, sip_state=, snmp=, smb_state=, smtp=, smtp_state=, socks=, ssh=, syslog=])) XXXXXXXXXX.XXXXXX MetaHookPre DrainEvents() +XXXXXXXXXX.XXXXXX MetaHookPre ObjDtor() XXXXXXXXXX.XXXXXX MetaHookPre QueueEvent(Broker::log_flush()) XXXXXXXXXX.XXXXXX MetaHookPre QueueEvent(ChecksumOffloading::check()) XXXXXXXXXX.XXXXXX MetaHookPre QueueEvent(filter_change_tracking()) @@ -4469,6 +4471,7 @@ XXXXXXXXXX.XXXXXX MetaHookPre QueueEvent(new_connection([id=[orig_h=141.142. XXXXXXXXXX.XXXXXX MetaHookPre SetupAnalyzerTree(XXXXXXXXXX.XXXXXX(XXXXXXXXXX.XXXXXX) TCP 141.142.228.5:59856 -> 192.150.187.43:80) XXXXXXXXXX.XXXXXX MetaHookPre UpdateNetworkTime(XXXXXXXXXX.XXXXXX) XXXXXXXXXX.XXXXXX | HookBroObjDtor +XXXXXXXXXX.XXXXXX | HookObjDtor XXXXXXXXXX.XXXXXX | HookUpdateNetworkTime XXXXXXXXXX.XXXXXX XXXXXXXXXX.XXXXXX | HookCallFunction Broker::__flush_logs() XXXXXXXXXX.XXXXXX | HookCallFunction Broker::flush_logs() diff --git a/testing/btest/plugins/hooks-plugin/src/Plugin.cc b/testing/btest/plugins/hooks-plugin/src/Plugin.cc index 7164257d63..e4d64ab0fc 100644 --- a/testing/btest/plugins/hooks-plugin/src/Plugin.cc +++ b/testing/btest/plugins/hooks-plugin/src/Plugin.cc @@ -31,6 +31,7 @@ zeek::plugin::Configuration Plugin::Configure() EnableHook(zeek::plugin::HOOK_LOG_INIT); EnableHook(zeek::plugin::HOOK_LOG_WRITE); EnableHook(zeek::plugin::HOOK_UNPROCESSED_PACKET); + EnableHook(zeek::plugin::HOOK_OBJ_DTOR); zeek::plugin::Configuration config; config.name = "Demo::Hooks"; @@ -156,6 +157,11 @@ void Plugin::HookBroObjDtor(void* obj) fprintf(stderr, "%.6f %-15s\n", zeek::run_state::network_time, "| HookBroObjDtor"); } +void Plugin::HookObjDtor(void* obj) + { + fprintf(stderr, "%.6f %-15s\n", zeek::run_state::network_time, "| HookObjDtor"); + } + void Plugin::MetaHookPre(zeek::plugin::HookType hook, const zeek::plugin::HookArgumentList& args) { zeek::ODesc d; diff --git a/testing/btest/plugins/hooks-plugin/src/Plugin.h b/testing/btest/plugins/hooks-plugin/src/Plugin.h index 22b7ada9a7..f2d6a2c6fc 100644 --- a/testing/btest/plugins/hooks-plugin/src/Plugin.h +++ b/testing/btest/plugins/hooks-plugin/src/Plugin.h @@ -16,6 +16,7 @@ protected: void HookDrainEvents() override; void HookUpdateNetworkTime(double network_time) override; void HookBroObjDtor(void* obj) override; + void HookObjDtor(void* obj) override; void HookLogInit(const std::string& writer, const std::string& instantiating_filter, bool local, bool remote, const zeek::logging::WriterBackend::WriterInfo& info, int num_fields, const zeek::threading::Field* const* fields) override;