Kaydet (Commit) 44e47c2c authored tarafından Caolán McNamara's avatar Caolán McNamara

ofz#4594 Integer-overflow

Change-Id: I6d73f514536e5b3e69573e24fd8b9f4b84e315c5
Reviewed-on: https://gerrit.libreoffice.org/46248Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 85beecd2
...@@ -12,22 +12,8 @@ ...@@ -12,22 +12,8 @@
#include <cassert> #include <cassert>
#include <unordered_map> #include <unordered_map>
namespace { sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction& rUN)
sal_Int32 lcl_GetPowerOf10(sal_Int32 nPower)
{ {
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(); auto nLen = rStr.getLength();
sal_Int32 nDecimalPoint = -1; sal_Int32 nDecimalPoint = -1;
sal_Int32 nIdx; sal_Int32 nIdx;
...@@ -44,113 +30,91 @@ sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction *pUN) ...@@ -44,113 +30,91 @@ sal_Int32 ParseMathMLUnsignedNumber(const OUString &rStr, Fraction *pUN)
if (cD < u'0' || u'9' < cD) if (cD < u'0' || u'9' < cD)
break; break;
} }
if (nIdx == 0 || ((nIdx == 1 || nIdx == 11) && nDecimalPoint == 0)) if (nIdx == 0 || (nIdx == 1 && nDecimalPoint == 0))
return -1; return -1;
if (nDecimalPoint == -1)
{ rUN = Fraction(rStr.copy(0, nIdx).toDouble());
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));
}
return nIdx; return nIdx;
} }
sal_Int32 ParseMathMLNumber(const OUString &rStr, Fraction *pN) sal_Int32 ParseMathMLNumber(const OUString &rStr, Fraction& rN)
{ {
assert(pN);
if (rStr.isEmpty()) if (rStr.isEmpty())
return -1; return -1;
bool bNegative = (rStr[0] == '-'); bool bNegative = (rStr[0] == '-');
sal_Int32 nOffset = bNegative ? 1 : 0; sal_Int32 nOffset = bNegative ? 1 : 0;
Fraction aF; Fraction aF;
auto nIdx = ParseMathMLUnsignedNumber(rStr.copy(nOffset), &aF); auto nIdx = ParseMathMLUnsignedNumber(rStr.copy(nOffset), aF);
if (nIdx <= 0) if (nIdx <= 0)
return -1; return -1;
if (bNegative) if (bNegative)
*pN = Fraction(aF.GetNumerator(), aF.GetDenominator()); rN = Fraction(aF.GetNumerator(), aF.GetDenominator());
else else
*pN = aF; rN = aF;
return nOffset + nIdx; 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, rV.aNumber);
auto nIdx = ParseMathMLNumber(rStr, &pV->aNumber);
if (nIdx <= 0) if (nIdx <= 0)
return -1; return -1;
OUString sRest = rStr.copy(nIdx); OUString sRest = rStr.copy(nIdx);
if (sRest.isEmpty()) if (sRest.isEmpty())
{ {
pV->eUnit = MathMLLengthUnit::None; rV.eUnit = MathMLLengthUnit::None;
return nIdx; return nIdx;
} }
if (sRest.startsWith("em")) if (sRest.startsWith("em"))
{ {
pV->eUnit = MathMLLengthUnit::Em; rV.eUnit = MathMLLengthUnit::Em;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("ex")) if (sRest.startsWith("ex"))
{ {
pV->eUnit = MathMLLengthUnit::Ex; rV.eUnit = MathMLLengthUnit::Ex;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("px")) if (sRest.startsWith("px"))
{ {
pV->eUnit = MathMLLengthUnit::Px; rV.eUnit = MathMLLengthUnit::Px;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("in")) if (sRest.startsWith("in"))
{ {
pV->eUnit = MathMLLengthUnit::In; rV.eUnit = MathMLLengthUnit::In;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("cm")) if (sRest.startsWith("cm"))
{ {
pV->eUnit = MathMLLengthUnit::Cm; rV.eUnit = MathMLLengthUnit::Cm;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("mm")) if (sRest.startsWith("mm"))
{ {
pV->eUnit = MathMLLengthUnit::Mm; rV.eUnit = MathMLLengthUnit::Mm;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("pt")) if (sRest.startsWith("pt"))
{ {
pV->eUnit = MathMLLengthUnit::Pt; rV.eUnit = MathMLLengthUnit::Pt;
return nIdx + 2; return nIdx + 2;
} }
if (sRest.startsWith("pc")) if (sRest.startsWith("pc"))
{ {
pV->eUnit = MathMLLengthUnit::Pc; rV.eUnit = MathMLLengthUnit::Pc;
return nIdx + 2; return nIdx + 2;
} }
if (sRest[0] == u'%') if (sRest[0] == u'%')
{ {
pV->eUnit = MathMLLengthUnit::Percent; rV.eUnit = MathMLLengthUnit::Percent;
return nIdx + 2; return nIdx + 2;
} }
return nIdx; return nIdx;
} }
bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue& rV)
bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV)
{ {
static const std::unordered_map<OUString, MathMLMathvariantValue> aMap{ static const std::unordered_map<OUString, MathMLMathvariantValue> aMap{
{"normal", MathMLMathvariantValue::Normal}, {"normal", MathMLMathvariantValue::Normal},
...@@ -173,11 +137,10 @@ bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV) ...@@ -173,11 +137,10 @@ bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV)
{"stretched", MathMLMathvariantValue::Stretched} {"stretched", MathMLMathvariantValue::Stretched}
}; };
assert(pV);
auto it = aMap.find(rStr); auto it = aMap.find(rStr);
if (it != aMap.end()) if (it != aMap.end())
{ {
*pV = it->second; rV = it->second;
return true; return true;
} }
return false; return false;
......
...@@ -45,7 +45,7 @@ struct MathMLAttributeLengthValue ...@@ -45,7 +45,7 @@ struct MathMLAttributeLengthValue
MathMLLengthUnit eUnit; 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 // MathML 3: 3.2.2 Mathematics style attributes common to token elements
...@@ -72,7 +72,7 @@ enum class MathMLMathvariantValue { ...@@ -72,7 +72,7 @@ enum class MathMLMathvariantValue {
Stretched Stretched
}; };
bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue *pV); bool GetMathMLMathvariantValue(const OUString &rStr, MathMLMathvariantValue& rV);
#endif #endif
......
...@@ -791,7 +791,7 @@ void SmXMLTokenAttrHelper::RetrieveAttrs(const uno::Reference<xml::sax::XAttribu ...@@ -791,7 +791,7 @@ void SmXMLTokenAttrHelper::RetrieveAttrs(const uno::Reference<xml::sax::XAttribu
switch(rAttrTokenMap.Get(nPrefix, aLocalName)) switch(rAttrTokenMap.Get(nPrefix, aLocalName))
{ {
case XML_TOK_MATHVARIANT: case XML_TOK_MATHVARIANT:
if (!GetMathMLMathvariantValue(sValue, &meMv)) if (!GetMathMLMathvariantValue(sValue, meMv))
SAL_WARN("starmath", "failed to recognize mathvariant: " << sValue); SAL_WARN("starmath", "failed to recognize mathvariant: " << sValue);
mbMvFound = true; mbMvFound = true;
break; break;
...@@ -1532,7 +1532,7 @@ void SmXMLSpaceContext_Impl::StartElement( ...@@ -1532,7 +1532,7 @@ void SmXMLSpaceContext_Impl::StartElement(
switch (rAttrTokenMap.Get(nPrefix, aLocalName)) switch (rAttrTokenMap.Get(nPrefix, aLocalName))
{ {
case XML_TOK_WIDTH: case XML_TOK_WIDTH:
if ( ParseMathMLAttributeLengthValue(sValue.trim(), &aLV) <= 0 || if ( ParseMathMLAttributeLengthValue(sValue.trim(), aLV) <= 0 ||
!lcl_CountBlanks(aLV, &nWide, &nNarrow) ) !lcl_CountBlanks(aLV, &nWide, &nNarrow) )
SAL_WARN("starmath", "ignore mspace's width: " << sValue); SAL_WARN("starmath", "ignore mspace's width: " << sValue);
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment