Merge pull request #423 from kohnakagawa/fix/parse_corrupted_version_resources

fix to handle exceptions in json_dump of ResourcesManager
This commit is contained in:
Romain 2020-05-28 06:23:40 +02:00 committed by GitHub
commit 2faa591440
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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"
@ -497,33 +499,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<json> 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<json> 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;
}
}