From ee5379248980caf32fb86fc9c8a576d4ebed5411 Mon Sep 17 00:00:00 2001 From: Kristian Duske Date: Wed, 20 Mar 2024 12:20:31 +0100 Subject: [PATCH] Don't crash when parsing entity definition file fails --- common/src/Model/GameImpl.cpp | 51 ++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/common/src/Model/GameImpl.cpp b/common/src/Model/GameImpl.cpp index 9e6814adb5..093488bacb 100644 --- a/common/src/Model/GameImpl.cpp +++ b/common/src/Model/GameImpl.cpp @@ -415,32 +415,39 @@ Result>> GameImpl:: const auto extension = path.extension().string(); const auto& defaultColor = m_config.entityConfig.defaultColor; - if (kdl::ci::str_is_equal(".fgd", extension)) - { - return IO::Disk::openFile(path).transform([&](auto file) { - auto reader = file->reader().buffer(); - auto parser = IO::FgdParser{reader.stringView(), defaultColor, path}; - return parser.parseDefinitions(status); - }); - } - if (kdl::ci::str_is_equal(".def", extension)) + try { - return IO::Disk::openFile(path).transform([&](auto file) { - auto reader = file->reader().buffer(); - auto parser = IO::DefParser{reader.stringView(), defaultColor}; - return parser.parseDefinitions(status); - }); + if (kdl::ci::str_is_equal(".fgd", extension)) + { + return IO::Disk::openFile(path).transform([&](auto file) { + auto reader = file->reader().buffer(); + auto parser = IO::FgdParser{reader.stringView(), defaultColor, path}; + return parser.parseDefinitions(status); + }); + } + if (kdl::ci::str_is_equal(".def", extension)) + { + return IO::Disk::openFile(path).transform([&](auto file) { + auto reader = file->reader().buffer(); + auto parser = IO::DefParser{reader.stringView(), defaultColor}; + return parser.parseDefinitions(status); + }); + } + if (kdl::ci::str_is_equal(".ent", extension)) + { + return IO::Disk::openFile(path).transform([&](auto file) { + auto reader = file->reader().buffer(); + auto parser = IO::EntParser{reader.stringView(), defaultColor}; + return parser.parseDefinitions(status); + }); + } + + return Error{"Unknown entity definition format: '" + path.string() + "'"}; } - if (kdl::ci::str_is_equal(".ent", extension)) + catch (const ParserException& e) { - return IO::Disk::openFile(path).transform([&](auto file) { - auto reader = file->reader().buffer(); - auto parser = IO::EntParser{reader.stringView(), defaultColor}; - return parser.parseDefinitions(status); - }); + return Error{e.what()}; } - - return Error{"Unknown entity definition format: '" + path.string() + "'"}; } std::unique_ptr GameImpl::doInitializeModel(