Check for possibility of inf value from FXSYS_wcstof()

Bug: chromium:951712
Change-Id: I9a4572aa9879e2c4ba374e78d37d9a959752318f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53310
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/css/cfx_cssdeclaration.cpp b/core/fxcrt/css/cfx_cssdeclaration.cpp
index 9f24019..707bd59 100644
--- a/core/fxcrt/css/cfx_cssdeclaration.cpp
+++ b/core/fxcrt/css/cfx_cssdeclaration.cpp
@@ -6,6 +6,7 @@
 
 #include "core/fxcrt/css/cfx_cssdeclaration.h"
 
+#include <cmath>
 #include <utility>
 
 #include "core/fxcrt/css/cfx_csscolorvalue.h"
@@ -35,7 +36,7 @@
 
   int32_t iUsedLen = 0;
   fValue = FXSYS_wcstof(pszValue, iValueLen, &iUsedLen);
-  if (iUsedLen <= 0)
+  if (iUsedLen <= 0 || !std::isfinite(fValue))
     return false;
 
   iValueLen -= iUsedLen;
diff --git a/core/fxcrt/fx_extension_unittest.cpp b/core/fxcrt/fx_extension_unittest.cpp
index 11684c9..81fc4f7 100644
--- a/core/fxcrt/fx_extension_unittest.cpp
+++ b/core/fxcrt/fx_extension_unittest.cpp
@@ -129,6 +129,21 @@
 
   // For https://crbug.com/pdfium/1217
   EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"e76", 3, nullptr));
+
+  // Overflow to infinity.
+  used_len = 0;
+  EXPECT_TRUE(std::isinf(FXSYS_wcstof(
+      L"88888888888888888888888888888888888888888888888888888888888888888888888"
+      L"88888888888888888888888888888888888888888888888888888888888",
+      130, &used_len)));
+  EXPECT_EQ(130, used_len);
+
+  used_len = 0;
+  EXPECT_TRUE(std::isinf(FXSYS_wcstof(
+      L"-8888888888888888888888888888888888888888888888888888888888888888888888"
+      L"888888888888888888888888888888888888888888888888888888888888",
+      131, &used_len)));
+  EXPECT_EQ(131, used_len);
 }
 
 TEST(fxcrt, FXSYS_SafeOps) {
diff --git a/core/fxcrt/fx_system.cpp b/core/fxcrt/fx_system.cpp
index 0731a08..673b286 100644
--- a/core/fxcrt/fx_system.cpp
+++ b/core/fxcrt/fx_system.cpp
@@ -6,6 +6,7 @@
 
 #include "core/fxcrt/fx_system.h"
 
+#include <cmath>
 #include <limits>
 
 #include "core/fxcrt/fx_extension.h"
@@ -83,6 +84,8 @@
 }  // namespace
 
 int FXSYS_round(float d) {
+  if (std::isnan(d))
+    return 0;
   if (d < static_cast<float>(std::numeric_limits<int>::min()))
     return std::numeric_limits<int>::min();
   if (d > static_cast<float>(std::numeric_limits<int>::max()))
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp
index 9ac8a88..d4e326f 100644
--- a/xfa/fxfa/parser/cxfa_measurement.cpp
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -6,6 +6,8 @@
 
 #include "xfa/fxfa/parser/cxfa_measurement.h"
 
+#include <cmath>
+
 #include "core/fxcrt/fx_extension.h"
 
 namespace {
@@ -32,8 +34,7 @@
 
 void CXFA_Measurement::SetString(WideStringView wsMeasure) {
   if (wsMeasure.IsEmpty()) {
-    m_fValue = 0;
-    m_eUnit = XFA_Unit::Unknown;
+    Set(0, XFA_Unit::Unknown);
     return;
   }
 
@@ -43,6 +44,9 @@
   int32_t iUsedLen = 0;
   float fValue = FXSYS_wcstof(wsMeasure.unterminated_c_str(),
                               wsMeasure.GetLength(), &iUsedLen);
+  if (!std::isfinite(fValue))
+    fValue = 0.0f;
+
   wsMeasure = wsMeasure.Right(wsMeasure.GetLength() - iUsedLen);
   Set(fValue, GetUnitFromString(wsMeasure));
 }
diff --git a/xfa/fxgraphics/cxfa_graphics.cpp b/xfa/fxgraphics/cxfa_graphics.cpp
index d2c7189..bd8bf28 100644
--- a/xfa/fxgraphics/cxfa_graphics.cpp
+++ b/xfa/fxgraphics/cxfa_graphics.cpp
@@ -303,7 +303,7 @@
             float x = static_cast<float>(column);
             scale = (((x - start_x) * x_span) + ((y - start_y) * y_span)) /
                     axis_len_square;
-            if (scale < 0.0f) {
+            if (std::isnan(scale) || scale < 0.0f) {
               if (!m_info.fillColor.GetShading()->m_isExtendedBegin)
                 continue;
               scale = 0.0f;