diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-12-11 15:41:50 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-12-11 22:21:49 +0100 |
commit | 44e47c2c32799e7833cc6cfd249c4d15306fd7e6 (patch) | |
tree | b9008919229225e0fbf8f70d091f259f1ae91633 /starmath | |
parent | 85beecd2dc1c7d916a68fed0977706bad77ccf12 (diff) |
ofz#4594 Integer-overflow
Change-Id: I6d73f514536e5b3e69573e24fd8b9f4b84e315c5
Reviewed-on: https://gerrit.libreoffice.org/46248
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'starmath')
-rw-r--r-- | starmath/source/mathmlattr.cxx | 83 | ||||
-rw-r--r-- | starmath/source/mathmlattr.hxx | 4 | ||||
-rw-r--r-- | starmath/source/mathmlimport.cxx | 4 |
3 files changed, 27 insertions, 64 deletions
diff --git a/starmath/source/mathmlattr.cxx b/starmath/source/mathmlattr.cxx index 2b0c70335430..74e32d42944b 100644 --- a/starmath/source/mathmlattr.cxx +++ b/starmath/source/mathmlattr.cxx @@ -12,22 +12,8 @@ #include <cassert> #include <unordered_map> -namespace { - -sal_Int32 lcl_GetPowerOf10(sal_Int32 nPower) +sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction& rUN) { - assert(nPower > 0); - sal_Int32 nResult = 1; - while (nPower--) - nResult *= 10; - return nResult; -} - -} - -sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction *pUN) -{ - assert(pUN); auto nLen = rStr.getLength(); sal_Int32 nDecimalPoint = -1; sal_Int32 nIdx; @@ -44,113 +30,91 @@ sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction *pUN) if (cD < u'0' || u'9' < cD) break; } - if (nIdx == 0 || ((nIdx == 1 || nIdx == 11) && nDecimalPoint == 0)) + if (nIdx == 0 || (nIdx == 1 && nDecimalPoint == 0)) return -1; - if (nDecimalPoint == -1) - { - assert(nIdx > 0); - *pUN = Fraction(rStr.copy(0, nIdx).toInt32(), 1); - return nIdx; - } - if (nDecimalPoint == 0) - { - assert(nIdx > 1); - *pUN = Fraction(rStr.copy(1, nIdx-1).toInt32(), lcl_GetPowerOf10(nIdx-1)); - return nIdx; - } - assert(0 < nDecimalPoint); - assert(nDecimalPoint < nIdx); - *pUN = Fraction(rStr.copy(0, nDecimalPoint).toInt32(), 1); - if (++nDecimalPoint < nIdx) - { - const sal_Int32 nDigits = nIdx - nDecimalPoint; - if (nDigits > 9) - return -1; - *pUN += Fraction(rStr.copy(nDecimalPoint, nDigits).toInt32(), lcl_GetPowerOf10(nDigits)); - } + + rUN = Fraction(rStr.copy(0, nIdx).toDouble()); + return nIdx; } -sal_Int32 ParseMathMLNumber(const OUString &rStr, Fraction *pN) +sal_Int32 ParseMathMLNumber(const OUString &rStr, Fraction& rN) { - assert(pN); if (rStr.isEmpty()) return -1; bool bNegative = (rStr[0] == '-'); sal_Int32 nOffset = bNegative ? 1 : 0; Fraction aF; - auto nIdx = ParseMathMLUnsignedNumber(rStr.copy(nOffset), &aF); + auto nIdx = ParseMathMLUnsignedNumber(rStr.copy(nOffset), aF); if (nIdx <= 0) return -1; if (bNegative) - *pN = Fraction(aF.GetNumerator(), aF.GetDenominator()); + rN = Fraction(aF.GetNumerator(), aF.GetDenominator()); else - *pN = aF; + rN = aF; return nOffset + nIdx; } -sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue *pV) +sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue& rV) { - assert(pV); - auto nIdx = ParseMathMLNumber(rStr, &pV->aNumber); + auto nIdx = ParseMathMLNumber(rStr, rV.aNumber); if (nIdx <= 0) return -1; OUString sRest = rStr.copy(nIdx); if (sRest.isEmpty()) { - pV->eUnit = MathMLLengthUnit::None; + rV.eUnit = MathMLLengthUnit::None; return nIdx; } if (sRest.startsWith("em")) { - pV->eUnit = MathMLLengthUnit::Em; + rV.eUnit = MathMLLengthUnit::Em; return nIdx + 2; } if (sRest.startsWith("ex")) { - pV->eUnit = MathMLLengthUnit::Ex; + rV.eUnit = MathMLLengthUnit::Ex; return nIdx + 2; } if (sRest.startsWith("px")) { - pV->eUnit = MathMLLengthUnit::Px; + rV.eUnit = MathMLLengthUnit::Px; return nIdx + 2; } if (sRest.startsWith("in")) { - pV->eUnit = MathMLLengthUnit::In; + rV.eUnit = MathMLLengthUnit::In; return nIdx + 2; } if (sRest.startsWith("cm")) { - pV->eUnit = MathMLLengthUnit::Cm; + rV.eUnit = MathMLLengthUnit::Cm; return nIdx + 2; } if (sRest.startsWith("mm")) { - pV->eUnit = MathMLLengthUnit::Mm; + rV.eUnit = MathMLLengthUnit::Mm; return nIdx + 2; } if (sRest.startsWith("pt")) { - pV->eUnit = MathMLLengthUnit::Pt; + rV.eUnit = MathMLLengthUnit::Pt; return nIdx + 2; } if (sRest.startsWith("pc")) { - pV->eUnit = MathMLLengthUnit::Pc; + rV.eUnit = MathMLLengthUnit::Pc; return nIdx + 2; } if (sRest[0] == u'%') { - pV->eUnit = MathMLLengthUnit::Percent; + rV.eUnit = MathMLLengthUnit::Percent; return nIdx + 2; } return nIdx; } - -bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV) +bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue& rV) { static const std::unordered_map<OUString, MathMLMathvariantValue> aMap{ {"normal", MathMLMathvariantValue::Normal}, @@ -173,11 +137,10 @@ bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV) {"stretched", MathMLMathvariantValue::Stretched} }; - assert(pV); auto it = aMap.find(rStr); if (it != aMap.end()) { - *pV = it->second; + rV = it->second; return true; } return false; diff --git a/starmath/source/mathmlattr.hxx b/starmath/source/mathmlattr.hxx index f5402546e68e..42948f43ccdf 100644 --- a/starmath/source/mathmlattr.hxx +++ b/starmath/source/mathmlattr.hxx @@ -45,7 +45,7 @@ struct MathMLAttributeLengthValue MathMLLengthUnit eUnit; }; -sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue *pV); +sal_Int32 ParseMathMLAttributeLengthValue(const OUString &rStr, MathMLAttributeLengthValue& rV); // MathML 3: 3.2.2 Mathematics style attributes common to token elements @@ -72,7 +72,7 @@ enum class MathMLMathvariantValue { Stretched }; -bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV); +bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue& rV); #endif diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx index 59fa00467b42..c69f6b501ae7 100644 --- a/starmath/source/mathmlimport.cxx +++ b/starmath/source/mathmlimport.cxx @@ -791,7 +791,7 @@ void SmXMLTokenAttrHelper::RetrieveAttrs(const uno::Reference<xml::sax::XAttribu switch(rAttrTokenMap.Get(nPrefix, aLocalName)) { case XML_TOK_MATHVARIANT: - if (!GetMathMLMathvariantValue(sValue, &meMv)) + if (!GetMathMLMathvariantValue(sValue, meMv)) SAL_WARN("starmath", "failed to recognize mathvariant: " << sValue); mbMvFound = true; break; @@ -1532,7 +1532,7 @@ void SmXMLSpaceContext_Impl::StartElement( switch (rAttrTokenMap.Get(nPrefix, aLocalName)) { case XML_TOK_WIDTH: - if ( ParseMathMLAttributeLengthValue(sValue.trim(), &aLV) <= 0 || + if ( ParseMathMLAttributeLengthValue(sValue.trim(), aLV) <= 0 || !lcl_CountBlanks(aLV, &nWide, &nNarrow) ) SAL_WARN("starmath", "ignore mspace's width: " << sValue); break; |