From 36099c55534ac8dc41cbdeade832ff747d64a47b Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Tue, 9 Mar 2021 15:00:27 -0800 Subject: [PATCH] Avoid searching a directory for dynamic plugins multiple times --- src/plugin/Manager.cc | 15 +++++++++++++++ src/plugin/Manager.h | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/src/plugin/Manager.cc b/src/plugin/Manager.cc index d629455dae..da4ff5fe32 100644 --- a/src/plugin/Manager.cc +++ b/src/plugin/Manager.cc @@ -7,6 +7,8 @@ #include #include #include +#include // for PATH_MAX +#include #include #include #include @@ -70,6 +72,19 @@ void Manager::SearchDynamicPlugins(const std::string& dir) return; } + char canon_path[PATH_MAX]; + if ( ! realpath(dir.data(), canon_path) ) + { + DBG_LOG(DBG_PLUGINS, "skip dynamic plugin search in %s, realpath failed: %s", + dir.data(), strerror(errno)); + return; + } + + if ( searched_dirs.count(canon_path) ) + return; + + searched_dirs.emplace(canon_path); + // Check if it's a plugin dirctory. const std::string magic = dir + "/__bro_plugin__"; diff --git a/src/plugin/Manager.h b/src/plugin/Manager.h index c97a411304..6af81e7b96 100644 --- a/src/plugin/Manager.h +++ b/src/plugin/Manager.h @@ -416,6 +416,11 @@ private: void MetaHookPre(HookType hook, const HookArgumentList& args) const; void MetaHookPost(HookType hook, const HookArgumentList& args, const HookArgument& result) const; + // Directories that have already been searched for dynamic plugins. + // Used to prevent multiple searches of the same dirs (e.g. via symlinks). + // The paths stored in the set are made canonical via realpath(). + std::set> searched_dirs; + // Plugins that were explicitly requested to be activated, but failed to // load at first. std::set requested_plugins;