Add negative overflow check to `QuicTimeDelta::TryFromMilliseconds`
This follows up on cl/810503972, which recently added the method. I realized that the definition, which only checked for positive overflow, was incomplete because the input is a signed type.
PiperOrigin-RevId: 810983573
diff --git a/quiche/quic/core/quic_time.h b/quiche/quic/core/quic_time.h
index 990b90c..db913d5 100644
--- a/quiche/quic/core/quic_time.h
+++ b/quiche/quic/core/quic_time.h
@@ -57,7 +57,8 @@
// the conversion would overflow.
static constexpr std::optional<QuicTimeDelta> TryFromMilliseconds(
int64_t ms) {
- if (ms > std::numeric_limits<int64_t>::max() / 1000) {
+ if (ms > std::numeric_limits<int64_t>::max() / 1000 ||
+ ms < std::numeric_limits<int64_t>::min() / 1000) {
return std::nullopt;
}
return QuicTimeDelta(ms * 1000);
diff --git a/quiche/quic/core/quic_time_test.cc b/quiche/quic/core/quic_time_test.cc
index 0f6d7d6..6877603 100644
--- a/quiche/quic/core/quic_time_test.cc
+++ b/quiche/quic/core/quic_time_test.cc
@@ -51,12 +51,12 @@
}
TEST_F(QuicTimeDeltaTest, TryFromMilliseconds) {
- static constexpr int64_t kMaxNumMilliseconds{
- std::numeric_limits<int64_t>::max() / 1000};
-
EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(0), QuicTime::Delta::Zero());
EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(2000),
QuicTime::Delta::FromMicroseconds(2000 * 1000));
+
+ static constexpr int64_t kMaxNumMilliseconds{
+ std::numeric_limits<int64_t>::max() / 1000};
EXPECT_THAT(
QuicTime::Delta::TryFromMilliseconds(kMaxNumMilliseconds),
Optional(AllOf(Property(&QuicTime::Delta::ToMicroseconds,
@@ -67,6 +67,19 @@
// Internal conversion to microseconds would overflow `int64_t`.
EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(kMaxNumMilliseconds + 1),
std::nullopt);
+
+ static constexpr int64_t kMinNumMilliseconds{
+ std::numeric_limits<int64_t>::min() / 1000};
+ EXPECT_THAT(
+ QuicTime::Delta::TryFromMilliseconds(kMinNumMilliseconds),
+ Optional(AllOf(Property(&QuicTime::Delta::ToMicroseconds,
+ kMinNumMilliseconds * 1000),
+ // `QuicTimeDelta::TryFromMilliseconds()` will never return
+ // an infinite duration.
+ Property(&QuicTime::Delta::IsInfinite, IsFalse()))));
+ // Internal conversion to microseconds would overflow `int64_t`.
+ EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(kMinNumMilliseconds - 1),
+ std::nullopt);
}
TEST_F(QuicTimeDeltaTest, Add) {