diff --git a/include/client.hpp b/include/client.hpp index af6eeef7..a54bf4b4 100644 --- a/include/client.hpp +++ b/include/client.hpp @@ -38,7 +38,7 @@ class Client { const std::string getValidPath(const std::vector &paths) const; void handleOutput(struct waybar_output &output); bool isValidOutput(const Json::Value &config, struct waybar_output &output); - auto setupConfig(const std::string &config_file) -> void; + auto setupConfig(const std::string &config_file, int depth) -> void; auto mergeConfig(Json::Value &a_config_, Json::Value &b_config_) -> void; auto setupCss(const std::string &css_file) -> void; struct waybar_output & getOutput(void *); diff --git a/src/client.cpp b/src/client.cpp index 7f3229cf..07c0b23d 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -234,7 +234,10 @@ std::tuple waybar::Client::getConfigs( return {config_file, css_file}; } -auto waybar::Client::setupConfig(const std::string &config_file) -> void { +auto waybar::Client::setupConfig(const std::string &config_file, int depth) -> void { + if (depth > 100) { + throw std::runtime_error("Aborting due to likely recursive include in config files"); + } std::ifstream file(config_file); if (!file.is_open()) { throw std::runtime_error("Can't open config file"); @@ -245,7 +248,7 @@ auto waybar::Client::setupConfig(const std::string &config_file) -> void { if (tmp_config_["include"].isArray()) { for (const auto &include : tmp_config_["include"]) { spdlog::info("Including resource file: {}", include.asString()); - setupConfig(getValidPath({include.asString()})); + setupConfig(getValidPath({include.asString()}), ++depth); } } mergeConfig(config_, tmp_config_); @@ -337,7 +340,7 @@ int waybar::Client::main(int argc, char *argv[]) { } wl_display = gdk_wayland_display_get_wl_display(gdk_display->gobj()); auto [config_file, css_file] = getConfigs(config, style); - setupConfig(config_file); + setupConfig(config_file, 0); setupCss(css_file); bindInterfaces(); gtk_app->hold();