summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-12-11 15:41:50 +0000
committerCaolán McNamara <caolanm@redhat.com>2017-12-11 22:21:49 +0100
commit44e47c2c32799e7833cc6cfd249c4d15306fd7e6 (patch)
treeb9008919229225e0fbf8f70d091f259f1ae91633 /starmath
parent85beecd2dc1c7d916a68fed0977706bad77ccf12 (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.cxx83
-rw-r--r--starmath/source/mathmlattr.hxx4
-rw-r--r--starmath/source/mathmlimport.cxx4
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;