Skip to content

Commit 9687039

Browse files
jnthntatumcopybara-github
authored andcommitted
Add missing return statements after errors in C++ planner.
Fixes a couple of cases where malformed expressions might lead to index out of bounds errors. PiperOrigin-RevId: 697727147
1 parent 200ae33 commit 9687039

File tree

3 files changed

+121
-0
lines changed

3 files changed

+121
-0
lines changed

eval/compiler/flat_expr_builder.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,7 @@ class FlatExprVisitor : public cel::AstVisitor {
933933
if (expr->call_expr().args().size() != 3) {
934934
SetProgressStatusError(absl::InvalidArgumentError(
935935
"unexpected number of args for builtin ternary"));
936+
return;
936937
}
937938

938939
const cel::ast_internal::Expr* condition_expr =
@@ -981,6 +982,7 @@ class FlatExprVisitor : public cel::AstVisitor {
981982
if (expr->call_expr().args().size() != 2) {
982983
SetProgressStatusError(absl::InvalidArgumentError(
983984
"unexpected number of args for builtin boolean operator &&/||"));
985+
return;
984986
}
985987
const cel::ast_internal::Expr* left_expr = &expr->call_expr().args()[0];
986988
const cel::ast_internal::Expr* right_expr = &expr->call_expr().args()[1];
@@ -1028,6 +1030,7 @@ class FlatExprVisitor : public cel::AstVisitor {
10281030
expr->call_expr().args().size() != 1) {
10291031
SetProgressStatusError(absl::InvalidArgumentError(
10301032
"unexpected number of args for optional.or{Value}"));
1033+
return;
10311034
}
10321035
const cel::ast_internal::Expr* left_expr = &expr->call_expr().target();
10331036
const cel::ast_internal::Expr* right_expr = &expr->call_expr().args()[0];
@@ -1188,6 +1191,7 @@ class FlatExprVisitor : public cel::AstVisitor {
11881191
if (args.size() != 2) {
11891192
SetProgressStatusError(absl::InvalidArgumentError(
11901193
"unexpected number of args for builtin index operator"));
1194+
return;
11911195
}
11921196
SetRecursiveStep(CreateDirectContainerAccessStep(
11931197
std::move(args[0]), std::move(args[1]),
@@ -1966,6 +1970,7 @@ void TernaryCondVisitor::PostVisitArg(int arg_num,
19661970
auto jump_after_first = CreateJumpStep({}, expr->id());
19671971
if (!jump_after_first.ok()) {
19681972
visitor_->SetProgressStatusError(jump_after_first.status());
1973+
return;
19691974
}
19701975

19711976
jump_after_first_ =

runtime/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ cc_test(
262262
":runtime_issue",
263263
":runtime_options",
264264
":standard_runtime_builder_factory",
265+
"//base:builtins",
265266
"//common:memory",
266267
"//common:source",
267268
"//common:value",
@@ -277,6 +278,7 @@ cc_test(
277278
"@com_google_absl//absl/base:no_destructor",
278279
"@com_google_absl//absl/log:absl_check",
279280
"@com_google_absl//absl/status",
281+
"@com_google_absl//absl/status:status_matchers",
280282
"@com_google_absl//absl/status:statusor",
281283
"@com_google_absl//absl/strings:string_view",
282284
"@com_google_cel_spec//proto/cel/expr:syntax_cc_proto",

runtime/standard_runtime_builder_factory_test.cc

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
#include "absl/base/no_destructor.h"
2525
#include "absl/log/absl_check.h"
2626
#include "absl/status/status.h"
27+
#include "absl/status/status_matchers.h"
2728
#include "absl/status/statusor.h"
2829
#include "absl/strings/string_view.h"
30+
#include "base/builtins.h"
2931
#include "common/memory.h"
3032
#include "common/source.h"
3133
#include "common/value.h"
@@ -51,6 +53,7 @@
5153
namespace cel {
5254
namespace {
5355

56+
using ::absl_testing::StatusIs;
5457
using ::cel::extensions::ProtobufRuntimeAdapter;
5558
using ::cel::extensions::ProtoMemoryManagerRef;
5659
using ::cel::test::BoolValueIs;
@@ -544,5 +547,116 @@ TEST(StandardRuntimeTest, RuntimeIssueSupport) {
544547
}
545548
}
546549

550+
enum class EvalStrategy { kIterative, kRecursive };
551+
552+
class StandardRuntimeEvalStrategyTest
553+
: public ::testing::TestWithParam<EvalStrategy> {};
554+
555+
// Check that calls to specialized builtins are validated.
556+
TEST_P(StandardRuntimeEvalStrategyTest, InvalidBuiltinBoolOp) {
557+
EvalStrategy eval_strategy = GetParam();
558+
RuntimeOptions options;
559+
if (eval_strategy == EvalStrategy::kRecursive) {
560+
options.max_recursion_depth = -1;
561+
} else {
562+
options.max_recursion_depth = 0;
563+
}
564+
565+
google::protobuf::Arena arena;
566+
567+
ASSERT_OK_AND_ASSIGN(auto builder,
568+
CreateStandardRuntimeBuilder(
569+
google::protobuf::DescriptorPool::generated_pool(), options));
570+
571+
ASSERT_OK_AND_ASSIGN(auto runtime, std::move(builder).Build());
572+
573+
ParsedExpr expr;
574+
expr.mutable_expr()->mutable_call_expr()->set_function(cel::builtin::kOr);
575+
auto* arg = expr.mutable_expr()->mutable_call_expr()->add_args();
576+
arg->mutable_const_expr()->set_bool_value(true);
577+
578+
EXPECT_THAT(ProtobufRuntimeAdapter::CreateProgram(*runtime, expr),
579+
StatusIs(absl::StatusCode::kInvalidArgument));
580+
}
581+
582+
TEST_P(StandardRuntimeEvalStrategyTest, InvalidBuiltinTernaryOp) {
583+
EvalStrategy eval_strategy = GetParam();
584+
RuntimeOptions options;
585+
if (eval_strategy == EvalStrategy::kRecursive) {
586+
options.max_recursion_depth = -1;
587+
} else {
588+
options.max_recursion_depth = 0;
589+
}
590+
591+
google::protobuf::Arena arena;
592+
593+
ASSERT_OK_AND_ASSIGN(auto builder,
594+
CreateStandardRuntimeBuilder(
595+
google::protobuf::DescriptorPool::generated_pool(), options));
596+
597+
ASSERT_OK_AND_ASSIGN(auto runtime, std::move(builder).Build());
598+
599+
ParsedExpr expr;
600+
expr.mutable_expr()->mutable_call_expr()->set_function(
601+
cel::builtin::kTernary);
602+
expr.mutable_expr()
603+
->mutable_call_expr()
604+
->add_args()
605+
->mutable_const_expr()
606+
->set_bool_value(true);
607+
expr.mutable_expr()
608+
->mutable_call_expr()
609+
->add_args()
610+
->mutable_const_expr()
611+
->set_bool_value(true);
612+
expr.mutable_expr()
613+
->mutable_call_expr()
614+
->add_args()
615+
->mutable_const_expr()
616+
->set_bool_value(true);
617+
expr.mutable_expr()
618+
->mutable_call_expr()
619+
->add_args()
620+
->mutable_const_expr()
621+
->set_bool_value(true);
622+
623+
EXPECT_THAT(ProtobufRuntimeAdapter::CreateProgram(*runtime, expr),
624+
StatusIs(absl::StatusCode::kInvalidArgument));
625+
}
626+
627+
TEST_P(StandardRuntimeEvalStrategyTest, InvalidBuiltinIndex) {
628+
EvalStrategy eval_strategy = GetParam();
629+
RuntimeOptions options;
630+
if (eval_strategy == EvalStrategy::kRecursive) {
631+
options.max_recursion_depth = -1;
632+
} else {
633+
options.max_recursion_depth = 0;
634+
}
635+
636+
google::protobuf::Arena arena;
637+
638+
ASSERT_OK_AND_ASSIGN(auto builder,
639+
CreateStandardRuntimeBuilder(
640+
google::protobuf::DescriptorPool::generated_pool(), options));
641+
642+
ASSERT_OK_AND_ASSIGN(auto runtime, std::move(builder).Build());
643+
644+
ParsedExpr expr;
645+
expr.mutable_expr()->mutable_call_expr()->set_function(cel::builtin::kIndex);
646+
auto* arg = expr.mutable_expr()->mutable_call_expr()->add_args();
647+
arg->mutable_list_expr()
648+
->add_elements()
649+
->mutable_const_expr()
650+
->set_int64_value(1);
651+
652+
EXPECT_THAT(ProtobufRuntimeAdapter::CreateProgram(*runtime, expr),
653+
StatusIs(absl::StatusCode::kInvalidArgument));
654+
}
655+
656+
INSTANTIATE_TEST_SUITE_P(StandardRuntimeEvalStrategyTest,
657+
StandardRuntimeEvalStrategyTest,
658+
testing::Values(EvalStrategy::kIterative,
659+
EvalStrategy::kRecursive));
660+
547661
} // namespace
548662
} // namespace cel

0 commit comments

Comments
 (0)