From b0a8fa959cbf8936a7e1aa558cf0c08bfa9e0a39 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Tue, 8 Jun 2021 11:27:39 -0400 Subject: cmScanDepFormat: P1689R4: Diagnose invalid provides/requires json type --- Source/cmScanDepFormat.cxx | 70 ++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/Source/cmScanDepFormat.cxx b/Source/cmScanDepFormat.cxx index 8e09a78..68ed3b2 100644 --- a/Source/cmScanDepFormat.cxx +++ b/Source/cmScanDepFormat.cxx @@ -133,46 +133,56 @@ bool cmScanDepFormat_P1689_Parse(std::string const& arg_pp, if (rule.isMember("provides")) { Json::Value const& provides = rule["provides"]; - if (provides.isArray()) { - for (auto const& provide : provides) { - cmSourceReqInfo provide_info; - - Json::Value const& logical_name = provide["logical-name"]; - PARSE_BLOB(logical_name, provide_info.LogicalName); - - if (provide.isMember("compiled-module-path")) { - Json::Value const& compiled_module_path = - provide["compiled-module-path"]; - PARSE_FILENAME(compiled_module_path, - provide_info.CompiledModulePath); - } else { - provide_info.CompiledModulePath = - cmStrCat(provide_info.LogicalName, ".mod"); - } - - info->Provides.push_back(provide_info); + if (!provides.isArray()) { + cmSystemTools::Error( + cmStrCat("-E cmake_ninja_dyndep failed to parse ", arg_pp, + ": provides is not an array")); + return false; + } + + for (auto const& provide : provides) { + cmSourceReqInfo provide_info; + + Json::Value const& logical_name = provide["logical-name"]; + PARSE_BLOB(logical_name, provide_info.LogicalName); + + if (provide.isMember("compiled-module-path")) { + Json::Value const& compiled_module_path = + provide["compiled-module-path"]; + PARSE_FILENAME(compiled_module_path, + provide_info.CompiledModulePath); + } else { + provide_info.CompiledModulePath = + cmStrCat(provide_info.LogicalName, ".mod"); } + + info->Provides.push_back(provide_info); } } if (rule.isMember("requires")) { Json::Value const& reqs = rule["requires"]; - if (reqs.isArray()) { - for (auto const& require : reqs) { - cmSourceReqInfo require_info; + if (!reqs.isArray()) { + cmSystemTools::Error( + cmStrCat("-E cmake_ninja_dyndep failed to parse ", arg_pp, + ": requires is not an array")); + return false; + } - Json::Value const& logical_name = require["logical-name"]; - PARSE_BLOB(logical_name, require_info.LogicalName); + for (auto const& require : reqs) { + cmSourceReqInfo require_info; - if (require.isMember("compiled-module-path")) { - Json::Value const& compiled_module_path = - require["compiled-module-path"]; - PARSE_FILENAME(compiled_module_path, - require_info.CompiledModulePath); - } + Json::Value const& logical_name = require["logical-name"]; + PARSE_BLOB(logical_name, require_info.LogicalName); - info->Requires.push_back(require_info); + if (require.isMember("compiled-module-path")) { + Json::Value const& compiled_module_path = + require["compiled-module-path"]; + PARSE_FILENAME(compiled_module_path, + require_info.CompiledModulePath); } + + info->Requires.push_back(require_info); } } } -- cgit v0.12