mirror of
https://github.com/falcosecurity/falco.git
synced 2025-08-09 10:07:57 +00:00
fix(userspace/engine): catch YAML parsing and validation errors with right context
Signed-off-by: Jason Dellaluce <jasondellaluce@gmail.com>
This commit is contained in:
parent
1b2c7ef7d9
commit
d79d7112a0
@ -64,6 +64,11 @@ rule_loader::context::context(const YAML::Node &item,
|
|||||||
init(parent.name(), position(item.Mark()), item_type, item_name, parent);
|
init(parent.name(), position(item.Mark()), item_type, item_name, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rule_loader::context::context(const YAML::Mark &mark, const context& parent)
|
||||||
|
{
|
||||||
|
init(parent.name(), position(mark), item_type::VALUE_FOR, "", parent);
|
||||||
|
}
|
||||||
|
|
||||||
rule_loader::context::context(const libsinsp::filter::ast::pos_info& pos,
|
rule_loader::context::context(const libsinsp::filter::ast::pos_info& pos,
|
||||||
const std::string& condition,
|
const std::string& condition,
|
||||||
const context& parent)
|
const context& parent)
|
||||||
|
@ -113,6 +113,9 @@ namespace rule_loader
|
|||||||
item_type item_type,
|
item_type item_type,
|
||||||
const std::string& item_name,
|
const std::string& item_name,
|
||||||
const context& parent);
|
const context& parent);
|
||||||
|
context(
|
||||||
|
const YAML::Mark &mark,
|
||||||
|
const context& parent);
|
||||||
|
|
||||||
// Build a context from a condition expression +
|
// Build a context from a condition expression +
|
||||||
// parser position. This does not use the original
|
// parser position. This does not use the original
|
||||||
|
@ -437,23 +437,32 @@ static void read_item(
|
|||||||
bool rule_loader::reader::read(rule_loader::configuration& cfg, collector& collector)
|
bool rule_loader::reader::read(rule_loader::configuration& cfg, collector& collector)
|
||||||
{
|
{
|
||||||
std::vector<YAML::Node> docs;
|
std::vector<YAML::Node> docs;
|
||||||
|
rule_loader::context ctx(cfg.name);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
docs = YAML::LoadAll(cfg.content);
|
docs = YAML::LoadAll(cfg.content);
|
||||||
}
|
}
|
||||||
catch(const exception& e)
|
catch (YAML::ParserException& e)
|
||||||
|
{
|
||||||
|
rule_loader::context ictx(e.mark, ctx);
|
||||||
|
cfg.res->add_error(falco::load_result::LOAD_ERR_YAML_PARSE, e.what(), ictx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (std::exception& e)
|
||||||
{
|
{
|
||||||
rule_loader::context ctx(cfg.name);
|
|
||||||
cfg.res->add_error(falco::load_result::LOAD_ERR_YAML_PARSE, e.what(), ctx);
|
cfg.res->add_error(falco::load_result::LOAD_ERR_YAML_PARSE, e.what(), ctx);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
cfg.res->add_error(falco::load_result::LOAD_ERR_YAML_PARSE, "unknown YAML parsing error", ctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto doc = docs.begin(); doc != docs.end(); doc++)
|
for (auto doc = docs.begin(); doc != docs.end(); doc++)
|
||||||
{
|
{
|
||||||
if (doc->IsDefined() && !doc->IsNull())
|
if (doc->IsDefined() && !doc->IsNull())
|
||||||
{
|
{
|
||||||
rule_loader::context ctx(cfg.name);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
THROW(!doc->IsMap() && !doc->IsSequence(),
|
THROW(!doc->IsMap() && !doc->IsSequence(),
|
||||||
"Rules content is not yaml",
|
"Rules content is not yaml",
|
||||||
@ -479,7 +488,23 @@ bool rule_loader::reader::read(rule_loader::configuration& cfg, collector& colle
|
|||||||
// as it's effectively a new rules file, for
|
// as it's effectively a new rules file, for
|
||||||
// consistency we stop at the first error.
|
// consistency we stop at the first error.
|
||||||
return false;
|
return false;
|
||||||
};
|
}
|
||||||
|
catch (YAML::ParserException& e)
|
||||||
|
{
|
||||||
|
rule_loader::context ictx(e.mark, ctx);
|
||||||
|
cfg.res->add_error(falco::load_result::LOAD_ERR_YAML_VALIDATE, e.what(), ictx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (std::exception& e)
|
||||||
|
{
|
||||||
|
cfg.res->add_error(falco::load_result::LOAD_ERR_VALIDATE, e.what(), ctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
cfg.res->add_error(falco::load_result::LOAD_ERR_VALIDATE, "unknown validation error", ctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user