Use size_t for lengths in FXSYS_wcstof(). -- Change to nName variables (where n means uNsigned of some sort). -- Remove the case where -1 means "unknown length" as callers always know the length. Change-Id: I907198c99bafe613012c99a28b05b422a2bbb942 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/87010 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 53b0d84..6bdbf4b 100644 --- a/core/fxcrt/css/cfx_cssdeclaration.cpp +++ b/core/fxcrt/css/cfx_cssdeclaration.cpp
@@ -37,13 +37,13 @@ DCHECK(pszValue); DCHECK_GT(iValueLen, 0); - int32_t iUsedLen = 0; - *pValue = FXSYS_wcstof(pszValue, iValueLen, &iUsedLen); - if (iUsedLen <= 0 || !isfinite(*pValue)) + size_t nUsedLen = 0; + *pValue = FXSYS_wcstof(pszValue, iValueLen, &nUsedLen); + if (nUsedLen == 0 || !isfinite(*pValue)) return false; - iValueLen -= iUsedLen; - pszValue += iUsedLen; + iValueLen -= nUsedLen; + pszValue += nUsedLen; *pOutUnit = CFX_CSSNumberValue::Unit::kNumber; if (iValueLen >= 1 && *pszValue == '%') { *pOutUnit = CFX_CSSNumberValue::Unit::kPercent;
diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp index 53186fa..6b0b537 100644 --- a/core/fxcrt/fx_extension.cpp +++ b/core/fxcrt/fx_extension.cpp
@@ -28,39 +28,36 @@ } // namespace -float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen) { +float FXSYS_wcstof(const wchar_t* pwsStr, size_t nLength, size_t* pUsedLen) { DCHECK(pwsStr); - - if (iLength < 0) - iLength = static_cast<int32_t>(wcslen(pwsStr)); - if (iLength == 0) + if (nLength == 0) return 0.0f; - int32_t iUsedLen = 0; + size_t nUsedLen = 0; bool bNegtive = false; - switch (pwsStr[iUsedLen]) { + switch (pwsStr[nUsedLen]) { case '-': bNegtive = true; FALLTHROUGH; case '+': - iUsedLen++; + nUsedLen++; break; } float fValue = 0.0f; - while (iUsedLen < iLength) { - wchar_t wch = pwsStr[iUsedLen]; + while (nUsedLen < nLength) { + wchar_t wch = pwsStr[nUsedLen]; if (!FXSYS_IsDecimalDigit(wch)) break; fValue = fValue * 10.0f + (wch - L'0'); - iUsedLen++; + nUsedLen++; } - if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') { + if (nUsedLen < nLength && pwsStr[nUsedLen] == L'.') { float fPrecise = 0.1f; - while (++iUsedLen < iLength) { - wchar_t wch = pwsStr[iUsedLen]; + while (++nUsedLen < nLength) { + wchar_t wch = pwsStr[nUsedLen]; if (!FXSYS_IsDecimalDigit(wch)) break; @@ -69,20 +66,20 @@ } } - if (iUsedLen < iLength && - (pwsStr[iUsedLen] == 'e' || pwsStr[iUsedLen] == 'E')) { - ++iUsedLen; + if (nUsedLen < nLength && + (pwsStr[nUsedLen] == 'e' || pwsStr[nUsedLen] == 'E')) { + ++nUsedLen; bool negative_exponent = false; - if (iUsedLen < iLength && - (pwsStr[iUsedLen] == '-' || pwsStr[iUsedLen] == '+')) { - negative_exponent = pwsStr[iUsedLen] == '-'; - ++iUsedLen; + if (nUsedLen < nLength && + (pwsStr[nUsedLen] == '-' || pwsStr[nUsedLen] == '+')) { + negative_exponent = pwsStr[nUsedLen] == '-'; + ++nUsedLen; } int32_t exp_value = 0; - while (iUsedLen < iLength) { - wchar_t wch = pwsStr[iUsedLen]; + while (nUsedLen < nLength) { + wchar_t wch = pwsStr[nUsedLen]; if (!FXSYS_IsDecimalDigit(wch)) break; @@ -97,7 +94,7 @@ return 0.0f; } - ++iUsedLen; + ++nUsedLen; } for (size_t i = exp_value; i > 0; --i) { @@ -111,7 +108,7 @@ } if (pUsedLen) - *pUsedLen = iUsedLen; + *pUsedLen = nUsedLen; return bNegtive ? -fValue : fValue; }
diff --git a/core/fxcrt/fx_extension.h b/core/fxcrt/fx_extension.h index 3cb5226..7319e5c 100644 --- a/core/fxcrt/fx_extension.h +++ b/core/fxcrt/fx_extension.h
@@ -22,7 +22,7 @@ #define FX_IsOdd(a) ((a)&1) -float FXSYS_wcstof(const wchar_t* pwsStr, int32_t iLength, int32_t* pUsedLen); +float FXSYS_wcstof(const wchar_t* pwsStr, size_t nLength, size_t* pUsedLen); wchar_t* FXSYS_wcsncpy(wchar_t* dstStr, const wchar_t* srcStr, size_t count); int32_t FXSYS_wcsnicmp(const wchar_t* s1, const wchar_t* s2, size_t count);
diff --git a/core/fxcrt/fx_extension_unittest.cpp b/core/fxcrt/fx_extension_unittest.cpp index 090c76b..70837fe 100644 --- a/core/fxcrt/fx_extension_unittest.cpp +++ b/core/fxcrt/fx_extension_unittest.cpp
@@ -129,40 +129,40 @@ } TEST(fxcrt, FXSYS_wcstof) { - int32_t used_len = 0; + size_t used_len = 0; EXPECT_FLOAT_EQ(-12.0f, FXSYS_wcstof(L"-12", 3, &used_len)); - EXPECT_EQ(3, used_len); + EXPECT_EQ(3u, used_len); used_len = 0; EXPECT_FLOAT_EQ(1.5362f, FXSYS_wcstof(L"1.5362", 6, &used_len)); - EXPECT_EQ(6, used_len); + EXPECT_EQ(6u, used_len); used_len = 0; EXPECT_FLOAT_EQ(0.875f, FXSYS_wcstof(L"0.875", 5, &used_len)); - EXPECT_EQ(5, used_len); + EXPECT_EQ(5u, used_len); used_len = 0; EXPECT_FLOAT_EQ(5.56e-2f, FXSYS_wcstof(L"5.56e-2", 7, &used_len)); - EXPECT_EQ(7, used_len); + EXPECT_EQ(7u, used_len); used_len = 0; EXPECT_FLOAT_EQ(1.234e10f, FXSYS_wcstof(L"1.234E10", 8, &used_len)); - EXPECT_EQ(8, used_len); + EXPECT_EQ(8u, used_len); used_len = 0; EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"1.234E100000000000000", 21, &used_len)); - EXPECT_EQ(0, used_len); + EXPECT_EQ(0u, used_len); used_len = 0; EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"1.234E-128", 21, &used_len)); - EXPECT_EQ(0, used_len); + EXPECT_EQ(0u, used_len); // TODO(dsinclair): This should round as per IEEE 64-bit values. // EXPECT_EQ(L"123456789.01234567", FXSYS_wcstof(L"123456789.012345678")); used_len = 0; EXPECT_FLOAT_EQ(123456789.012345678f, FXSYS_wcstof(L"123456789.012345678", 19, &used_len)); - EXPECT_EQ(19, used_len); + EXPECT_EQ(19u, used_len); // TODO(dsinclair): This is spec'd as rounding when > 16 significant digits // prior to the exponent. @@ -170,7 +170,7 @@ used_len = 0; EXPECT_FLOAT_EQ(99999999999999999.0f, FXSYS_wcstof(L"99999999999999999", 17, &used_len)); - EXPECT_EQ(17, used_len); + EXPECT_EQ(17u, used_len); // For https://crbug.com/pdfium/1217 EXPECT_FLOAT_EQ(0.0f, FXSYS_wcstof(L"e76", 3, nullptr)); @@ -181,14 +181,14 @@ L"88888888888888888888888888888888888888888888888888888888888888888888888" L"88888888888888888888888888888888888888888888888888888888888", 130, &used_len))); - EXPECT_EQ(130, used_len); + EXPECT_EQ(130u, used_len); used_len = 0; EXPECT_TRUE(isinf(FXSYS_wcstof( L"-8888888888888888888888888888888888888888888888888888888888888888888888" L"888888888888888888888888888888888888888888888888888888888888", 131, &used_len))); - EXPECT_EQ(131, used_len); + EXPECT_EQ(131u, used_len); } TEST(fxcrt, FXSYS_SafeOps) {
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp index b6eb7ea..65698a7 100644 --- a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp +++ b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
@@ -306,7 +306,7 @@ CXFA_FMLexer::Token CXFA_FMLexer::AdvanceForNumber() { // This will set end to the character after the end of the number. - int32_t used_length = 0; + size_t used_length = 0; if (m_nCursor < m_spInput.size()) { FXSYS_wcstof(&m_spInput[m_nCursor], m_spInput.size() - m_nCursor, &used_length);
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp index c188ef3..3da98f8 100644 --- a/xfa/fxfa/parser/cxfa_measurement.cpp +++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -42,13 +42,13 @@ if (wsMeasure[0] == L'=') wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - 1); - int32_t iUsedLen = 0; + size_t nUsedLen = 0; float fValue = FXSYS_wcstof(wsMeasure.unterminated_c_str(), - wsMeasure.GetLength(), &iUsedLen); + wsMeasure.GetLength(), &nUsedLen); if (!isfinite(fValue)) fValue = 0.0f; - wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - iUsedLen); + wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - nUsedLen); Set(fValue, GetUnitFromString(wsMeasure)); }