From a1521128e19addea2abbf7be6ab1d56bccf5302c Mon Sep 17 00:00:00 2001 From: "Koh M. Nakagawa" Date: Wed, 20 May 2020 19:16:39 +0900 Subject: [PATCH] fix to handle exceptions in json_dump of ResourcesManager --- src/PE/json.cpp | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/PE/json.cpp b/src/PE/json.cpp index f3b1d66..b5e6b49 100644 --- a/src/PE/json.cpp +++ b/src/PE/json.cpp @@ -14,6 +14,8 @@ * limitations under the License. */ +#include "LIEF/logging++.hpp" + #include "LIEF/PE/json.hpp" #include "LIEF/hash.hpp" #include "LIEF/PE.hpp" @@ -486,33 +488,49 @@ void JsonVisitor::visit(const ResourceDirectory& resource_directory) { void JsonVisitor::visit(const ResourcesManager& resources_manager) { if (resources_manager.has_manifest()) { - this->node_["manifest"] = resources_manager.manifest(); + try { + this->node_["manifest"] = resources_manager.manifest(); + } catch (const LIEF::exception& e) { + LOG(WARNING) << e.what(); + } } if (resources_manager.has_version()) { JsonVisitor version_visitor; - version_visitor(resources_manager.version()); - this->node_["version"] = version_visitor.get(); + try { + version_visitor(resources_manager.version()); + this->node_["version"] = version_visitor.get(); + } catch (const LIEF::exception& e) { + LOG(WARNING) << e.what(); + } } if (resources_manager.has_icons()) { std::vector icons; - for (const ResourceIcon& icon : resources_manager.icons()) { - JsonVisitor icon_visitor; - icon_visitor(icon); - icons.emplace_back(icon_visitor.get()); + try { + for (const ResourceIcon& icon : resources_manager.icons()) { + JsonVisitor icon_visitor; + icon_visitor(icon); + icons.emplace_back(icon_visitor.get()); + } + this->node_["icons"] = icons; + } catch (const LIEF::exception& e) { + LOG(WARNING) << e.what(); } - this->node_["icons"] = icons; } if (resources_manager.has_dialogs()) { std::vector dialogs; - for (const ResourceDialog& dialog : resources_manager.dialogs()) { - JsonVisitor dialog_visitor; - dialog_visitor(dialog); - dialogs.emplace_back(dialog_visitor.get()); + try { + for (const ResourceDialog& dialog : resources_manager.dialogs()) { + JsonVisitor dialog_visitor; + dialog_visitor(dialog); + dialogs.emplace_back(dialog_visitor.get()); + } + this->node_["dialogs"] = dialogs; + } catch (const LIEF::exception& e) { + LOG(WARNING) << e.what(); } - this->node_["dialogs"] = dialogs; } }