[Libreoffice-commits] core.git: sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Fri Oct 26 14:35:19 UTC 2018
sc/source/core/inc/interpre.hxx | 16 ++++++++++++++++
sc/source/core/tool/interpr1.cxx | 5 ++++-
sc/source/core/tool/interpr8.cxx | 38 +++++++++++++++++++++++++++++---------
3 files changed, 49 insertions(+), 10 deletions(-)
New commits:
commit ca844d61ea19c9b2096db6047110ec0257d817bb
Author: Eike Rathke <erack at redhat.com>
AuthorDate: Fri Oct 26 11:12:30 2018 +0200
Commit: Eike Rathke <erack at redhat.com>
CommitDate: Fri Oct 26 16:34:54 2018 +0200
Use CheckStringResultLen() also for CONCATENATE(), CONCAT() and TEXTJOIN()
Change-Id: Ifbc2b127998e037be3f014bebf8721bef15ef53b
Reviewed-on: https://gerrit.libreoffice.org/62385
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack at redhat.com>
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index c7bcfb9a7d91..7608098d53bb 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -484,6 +484,11 @@ private:
// Check for String overflow of rResult+rAdd and set error and erase rResult
// if so. Return true if ok, false if overflow
inline bool CheckStringResultLen( OUString& rResult, const OUString& rAdd );
+
+ // Check for String overflow of rResult+rAdd and set error and erase rResult
+ // if so. Return true if ok, false if overflow
+ inline bool CheckStringResultLen( OUStringBuffer& rResult, const OUString& rAdd );
+
// Set error according to rVal, and set rVal to 0.0 if there was an error.
inline void TreatDoubleError( double& rVal );
// Lookup using ScLookupCache, @returns true if found and result address
@@ -1112,6 +1117,17 @@ inline bool ScInterpreter::CheckStringResultLen( OUString& rResult, const OUStri
return true;
}
+inline bool ScInterpreter::CheckStringResultLen( OUStringBuffer& rResult, const OUString& rAdd )
+{
+ if (rAdd.getLength() > kScInterpreterMaxStrLen - rResult.getLength())
+ {
+ SetError( FormulaError::StringOverflow );
+ rResult = OUStringBuffer();
+ return false;
+ }
+ return true;
+}
+
inline void ScInterpreter::TreatDoubleError( double& rVal )
{
if ( !::rtl::math::isFinite( rVal ) )
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index a0ae2d5ded14..6c3012ad2ad9 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -9456,7 +9456,10 @@ void ScInterpreter::ScConcat()
while( nParamCount-- > 0)
{
OUString aStr = GetString().getString();
- aRes = aStr + aRes;
+ if (CheckStringResultLen( aRes, aStr))
+ aRes = aStr + aRes;
+ else
+ break;
}
PushString( aRes );
}
diff --git a/sc/source/core/tool/interpr8.cxx b/sc/source/core/tool/interpr8.cxx
index 647a450afa35..8fad91109fbc 100644
--- a/sc/source/core/tool/interpr8.cxx
+++ b/sc/source/core/tool/interpr8.cxx
@@ -1359,7 +1359,11 @@ void ScInterpreter::ScConcat_MS()
{
case svString:
case svDouble:
- aResBuf.append( GetString().getString() );
+ {
+ const OUString& rStr = GetString().getString();
+ if (CheckStringResultLen( aResBuf, rStr))
+ aResBuf.append( rStr);
+ }
break;
case svSingleRef :
{
@@ -1374,7 +1378,9 @@ void ScInterpreter::ScConcat_MS()
{
svl::SharedString aSS;
GetCellString( aSS, aCell);
- aResBuf.append( aSS.getString());
+ const OUString& rStr = aSS.getString();
+ if (CheckStringResultLen( aResBuf, rStr))
+ aResBuf.append( rStr);
}
}
}
@@ -1415,7 +1421,9 @@ void ScInterpreter::ScConcat_MS()
{
svl::SharedString aSS;
GetCellString( aSS, aCell);
- aResBuf.append( aSS.getString());
+ const OUString& rStr = aSS.getString();
+ if (CheckStringResultLen( aResBuf, rStr))
+ aResBuf.append( rStr);
}
}
}
@@ -1440,11 +1448,19 @@ void ScInterpreter::ScConcat_MS()
for (SCSIZE k = 0; k < nR; k++ )
{
if ( pMat->IsStringOrEmpty( j, k ) )
- aResBuf.append( pMat->GetString( j, k ).getString() );
+ {
+ const OUString& rStr = pMat->GetString( j, k ).getString();
+ if (CheckStringResultLen( aResBuf, rStr))
+ aResBuf.append( rStr);
+ }
else
{
if ( pMat->IsValue( j, k ) )
- aResBuf.append( pMat->GetString( *pFormatter, j, k ).getString() );
+ {
+ const OUString& rStr = pMat->GetString( *pFormatter, j, k ).getString();
+ if (CheckStringResultLen( aResBuf, rStr))
+ aResBuf.append( rStr);
+ }
}
}
}
@@ -1617,7 +1633,8 @@ void ScInterpreter::ScTextJoin_MS()
}
else
bFirst = false;
- aResBuf.append( aStr );
+ if (CheckStringResultLen( aResBuf, aStr))
+ aResBuf.append( aStr );
}
}
break;
@@ -1653,7 +1670,8 @@ void ScInterpreter::ScTextJoin_MS()
}
else
bFirst = false;
- aResBuf.append( aStr );
+ if (CheckStringResultLen( aResBuf, aStr))
+ aResBuf.append( aStr );
}
}
break;
@@ -1712,7 +1730,8 @@ void ScInterpreter::ScTextJoin_MS()
}
else
bFirst = false;
- aResBuf.append( aStr );
+ if (CheckStringResultLen( aResBuf, aStr))
+ aResBuf.append( aStr );
}
}
}
@@ -1761,7 +1780,8 @@ void ScInterpreter::ScTextJoin_MS()
}
else
bFirst = false;
- aResBuf.append( aStr );
+ if (CheckStringResultLen( aResBuf, aStr))
+ aResBuf.append( aStr );
}
}
}
More information about the Libreoffice-commits
mailing list