diff options
author | Tom Sepez <tsepez@chromium.org> | 2018-09-13 17:41:52 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-09-13 17:41:52 +0000 |
commit | a5d7ad3aa8feb08a14b5cca173d673054c1ade23 (patch) | |
tree | 259f0c17f5b7a2e09f80948f8b5cc8a04fdb7874 /core/fpdfapi/page/cpdf_streamcontentparser.cpp | |
parent | aebace3bd14eaf72d43f63d90700cd1b0fa049ca (diff) | |
download | pdfium-a5d7ad3aa8feb08a14b5cca173d673054c1ade23.tar.xz |
Introduce FX_Number class as a replacement for FX_atonum().
The issue with FX_atonum() is that it doesn't return any information
about whether it range-checked its integer values as a signed or
unsigned type, even though it knows this as part of its processing.
Rather than adding another out parameter to that function, create
a class to hold all this information together.
This is the first place things went astray while diagnosing
bug 882959, in that a large positive value was cast to float as a
negative value. Unfortunately, this doesn't affect the related bug,
but is a step in the right direction.
Change-Id: I0977ec8fccf85e2632a962507bdd30a1cbe6d33c
Reviewed-on: https://pdfium-review.googlesource.com/42353
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'core/fpdfapi/page/cpdf_streamcontentparser.cpp')
-rw-r--r-- | core/fpdfapi/page/cpdf_streamcontentparser.cpp | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp index 2244232ecb..20892cc264 100644 --- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp +++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp @@ -338,7 +338,7 @@ void CPDF_StreamContentParser::AddNameParam(const ByteStringView& bsName) { void CPDF_StreamContentParser::AddNumberParam(const ByteStringView& str) { ContentParam& param = m_ParamBuf[GetNextParamPos()]; param.m_Type = ContentParam::NUMBER; - param.m_Number.m_bInteger = FX_atonum(str, ¶m.m_Number.m_Integer); + param.m_Number = FX_Number(str); } void CPDF_StreamContentParser::AddObjectParam( @@ -373,9 +373,9 @@ CPDF_Object* CPDF_StreamContentParser::GetObject(uint32_t index) { if (param.m_Type == ContentParam::NUMBER) { param.m_Type = ContentParam::OBJECT; param.m_pObject = - param.m_Number.m_bInteger - ? pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Integer) - : pdfium::MakeUnique<CPDF_Number>(param.m_Number.m_Float); + param.m_Number.IsInteger() + ? pdfium::MakeUnique<CPDF_Number>(param.m_Number.GetSigned()) + : pdfium::MakeUnique<CPDF_Number>(param.m_Number.GetFloat()); return param.m_pObject.get(); } if (param.m_Type == ContentParam::NAME) { @@ -411,21 +411,20 @@ ByteString CPDF_StreamContentParser::GetString(uint32_t index) const { } float CPDF_StreamContentParser::GetNumber(uint32_t index) const { - if (index >= m_ParamCount) { + if (index >= m_ParamCount) return 0; - } + int real_index = m_ParamStartPos + m_ParamCount - index - 1; - if (real_index >= kParamBufSize) { + if (real_index >= kParamBufSize) real_index -= kParamBufSize; - } + const ContentParam& param = m_ParamBuf[real_index]; - if (param.m_Type == ContentParam::NUMBER) { - return param.m_Number.m_bInteger - ? static_cast<float>(param.m_Number.m_Integer) - : param.m_Number.m_Float; - } + if (param.m_Type == ContentParam::NUMBER) + return param.m_Number.GetFloat(); + if (param.m_Type == 0 && param.m_pObject) return param.m_pObject->GetNumber(); + return 0; } @@ -1632,10 +1631,8 @@ void CPDF_StreamContentParser::ParsePathObject() { if (nParams == 6) break; - int value; - bool bInteger = FX_atonum(m_pSyntax->GetWord(), &value); - params[nParams++] = bInteger ? static_cast<float>(value) - : *reinterpret_cast<float*>(&value); + FX_Number number(m_pSyntax->GetWord()); + params[nParams++] = number.GetFloat(); break; } default: |