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) {