pw_log_rpc: Fix out-of-range memory access
The tests of pw_log_rpc attempt to access out-of-range array indicies.
This change resizes the arrays to properly hold the test contents.
Bug: b/239856986
Change-Id: I0be710253a1039e91d0258270fcfec6798def17e
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/103790
Pigweed-Auto-Submit: Armando Montanez <amontanez@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Reviewed-by: Carlos Chinchilla <cachinchilla@google.com>
diff --git a/pw_log_rpc/log_filter_service_test.cc b/pw_log_rpc/log_filter_service_test.cc
index 2c1606d..8e30d5c 100644
--- a/pw_log_rpc/log_filter_service_test.cc
+++ b/pw_log_rpc/log_filter_service_test.cc
@@ -38,7 +38,7 @@
protected:
FilterMap filter_map_;
- static constexpr size_t kMaxFilterRules = 3;
+ static constexpr size_t kMaxFilterRules = 4;
std::array<Filter::Rule, kMaxFilterRules> rules1_;
std::array<Filter::Rule, kMaxFilterRules> rules2_;
std::array<Filter::Rule, kMaxFilterRules> rules3_;
@@ -137,7 +137,7 @@
}
TEST_F(FilterServiceTest, SetFilterRules) {
- const std::array<Filter::Rule, 4> new_rules{{
+ const std::array<Filter::Rule, kMaxFilterRules> new_rules{{
{
.action = Filter::Rule::Action::kKeep,
.level_greater_than_or_equal = log::FilterRule::Level::DEBUG_LEVEL,
@@ -175,8 +175,9 @@
std::byte('R')},
},
}};
- const Filter new_filter(filters_[0].id(),
- const_cast<std::array<Filter::Rule, 4>&>(new_rules));
+ const Filter new_filter(
+ filters_[0].id(),
+ const_cast<std::array<Filter::Rule, kMaxFilterRules>&>(new_rules));
std::byte request_buffer[512];
const auto request = EncodeFilterRequest(new_filter, request_buffer);
@@ -194,7 +195,7 @@
}
TEST_F(FilterServiceTest, SetFilterRulesWhenUsedByDrain) {
- const std::array<Filter::Rule, 4> new_filter_rules{{
+ const std::array<Filter::Rule, kMaxFilterRules> new_filter_rules{{
{
.action = Filter::Rule::Action::kKeep,
.level_greater_than_or_equal = log::FilterRule::Level::CRITICAL_LEVEL,
@@ -238,7 +239,8 @@
}};
Filter& filter = filters_[0];
const Filter new_filter(
- filter.id(), const_cast<std::array<Filter::Rule, 4>&>(new_filter_rules));
+ filter.id(),
+ const_cast<std::array<Filter::Rule, kMaxFilterRules>&>(new_filter_rules));
std::byte request_buffer[256];
const auto request = EncodeFilterRequest(new_filter, request_buffer);
@@ -266,7 +268,7 @@
}
// A new request for logs with a new filter updates filter.
- const std::array<Filter::Rule, 4> second_filter_rules{{
+ const std::array<Filter::Rule, kMaxFilterRules> second_filter_rules{{
{
.action = Filter::Rule::Action::kKeep,
.level_greater_than_or_equal = log::FilterRule::Level::DEBUG_LEVEL,
@@ -298,7 +300,8 @@
}};
const Filter second_filter(
filter.id(),
- const_cast<std::array<Filter::Rule, 4>&>(second_filter_rules));
+ const_cast<std::array<Filter::Rule, kMaxFilterRules>&>(
+ second_filter_rules));
std::memset(request_buffer, 0, sizeof(request_buffer));
const auto second_filter_request =
diff --git a/pw_log_rpc/log_service_test.cc b/pw_log_rpc/log_service_test.cc
index f77d5bc..a8296be 100644
--- a/pw_log_rpc/log_service_test.cc
+++ b/pw_log_rpc/log_service_test.cc
@@ -114,7 +114,7 @@
multisink::MultiSink multisink_;
RpcLogDrainMap drain_map_;
std::array<std::byte, kMaxLogEntrySize> entry_encode_buffer_;
- static constexpr size_t kMaxFilterRules = 3;
+ static constexpr size_t kMaxFilterRules = 4;
std::array<Filter::Rule, kMaxFilterRules> rules1_;
std::array<Filter::Rule, kMaxFilterRules> rules2_;
std::array<Filter::Rule, kMaxFilterRules> rules3_;