Saturate, rather than CHECK() in FX_Number
The CHECK() introduced in
https://pdfium-review.googlesource.com/c/pdfium/+/110970
was readily hit by the fuzzers. Keep them from tripping over this
condition by saturating instead (the behaviour is not well specified
so this seems reasonable).
Bug: chromium:1470690
Change-Id: Ib0230bd43dc67d2233ddccdb4c1004e3ad6e1347
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/111030
Auto-Submit: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcrt/fx_number.cpp b/core/fxcrt/fx_number.cpp
index 4e58490..d577531 100644
--- a/core/fxcrt/fx_number.cpp
+++ b/core/fxcrt/fx_number.cpp
@@ -93,7 +93,7 @@
return m_SignedValue;
}
- return pdfium::base::checked_cast<int32_t>(m_FloatValue);
+ return pdfium::base::saturated_cast<int32_t>(m_FloatValue);
}
float FX_Number::GetFloat() const {
diff --git a/core/fxcrt/fx_number_unittest.cpp b/core/fxcrt/fx_number_unittest.cpp
index ebfdfe7..9a1d2eb 100644
--- a/core/fxcrt/fx_number_unittest.cpp
+++ b/core/fxcrt/fx_number_unittest.cpp
@@ -43,15 +43,18 @@
EXPECT_TRUE(number2.IsSigned());
EXPECT_EQ(-100, number2.GetSigned());
EXPECT_FLOAT_EQ(-100.001f, number2.GetFloat());
-}
-TEST(fxnumberDeathTest, FromFloatOutOfIntegerRange) {
- FX_Number number(1e17f);
- EXPECT_FALSE(number.IsInteger());
- EXPECT_TRUE(number.IsSigned());
- ASSERT_DEATH({ number.GetSigned(); },
- // The CHECK macro doesn't produce useful error messages
- "");
+ // Show positive saturation.
+ FX_Number number3(1e17f);
+ EXPECT_FALSE(number3.IsInteger());
+ EXPECT_TRUE(number3.IsSigned());
+ EXPECT_EQ(std::numeric_limits<int32_t>::max(), number3.GetSigned());
+
+ // Show negative saturation.
+ FX_Number number4(-1e17f);
+ EXPECT_FALSE(number4.IsInteger());
+ EXPECT_TRUE(number4.IsSigned());
+ EXPECT_EQ(std::numeric_limits<int32_t>::min(), number4.GetSigned());
}
TEST(fxnumber, FromStringUnsigned) {