Skip to content

Commit 355288c

Browse files
reject out-of-range day in grpc datetime IsValid
1 parent 29cd393 commit 355288c

2 files changed

Lines changed: 6 additions & 1 deletion

File tree

grpc/src/ugrpc/datetime_utils.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ bool IsValid(const google::type::Date& grpc_date) {
3838
return (grpc_date.year() >= 1 && grpc_date.year() < 10'000) &&
3939
(grpc_date.month() >= 1 && grpc_date.month() <= 12) &&
4040
(grpc_date.day() >= 1 &&
41-
std::chrono::day(grpc_date.day()) <= utils::datetime::DaysInMonth(grpc_date.month(), grpc_date.year()));
41+
grpc_date.day() <= static_cast<int>(static_cast<unsigned>(
42+
utils::datetime::DaysInMonth(grpc_date.month(), grpc_date.year())
43+
)));
4244
}
4345

4446
#if __cpp_lib_chrono >= 201907L

grpc/tests/datetime_utils_test.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ TEST(DatetimeUtilsDateIsValid, BigMonth) { EXPECT_FALSE(ugrpc::IsValid(MakeDate(
149149
TEST(DatetimeUtilsDateIsValid, NegativeDay) { EXPECT_FALSE(ugrpc::IsValid(MakeDate(2025, 4, -10))); }
150150
TEST(DatetimeUtilsDateIsValid, BigDay) { EXPECT_FALSE(ugrpc::IsValid(MakeDate(2025, 4, 50))); }
151151
TEST(DatetimeUtilsDateIsValid, DayDoesNotMatchMonth) { EXPECT_FALSE(ugrpc::IsValid(MakeDate(2025, 4, 31))); }
152+
// day is a wire-controlled int32; values above 255 must not wrap into the valid range
153+
TEST(DatetimeUtilsDateIsValid, DayWrapsToZero) { EXPECT_FALSE(ugrpc::IsValid(MakeDate(2025, 4, 256))); }
154+
TEST(DatetimeUtilsDateIsValid, DayWrapsIntoValidRange) { EXPECT_FALSE(ugrpc::IsValid(MakeDate(2025, 4, 286))); }
152155

153156
#if __cpp_lib_chrono >= 201907L
154157

0 commit comments

Comments
 (0)