diff options
author | Eike Rathke <erack@redhat.com> | 2019-01-29 15:25:52 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-02-13 10:02:47 +0100 |
commit | 99b0a3702d9c04c68d33adb9fbf1fd289618cc89 (patch) | |
tree | 97430ad2f8c0edd86279b9306b9cb43bde825351 /sc/source | |
parent | ba5e640cc4880ef023b5ea501b1b99e0a3ba25bd (diff) |
Resolves: tdf#93951 set remainder as bad string if not parsed as valid
Change-Id: Ieb9fa5e9cd2d5919a36fbe65ced107eab33c72e2
Reviewed-on: https://gerrit.libreoffice.org/67090
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
(cherry picked from commit 7d6f30d04c51088b26815c241a7473c48822c6c3)
Reviewed-on: https://gerrit.libreoffice.org/67115
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index eef51bbeecff..7ed3845f967e 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -2630,6 +2630,7 @@ Label_MaskStateMachine: } if ( bi18n ) { + const sal_Int32 nOldSrcPos = nSrcPos; nSrcPos = nSrcPos + nSpaces; OUStringBuffer aSymbol; mnRangeOpPosInSymbol = -1; @@ -2649,11 +2650,15 @@ Label_MaskStateMachine: SetError( nErr ); // parsed chars as string } if ( aRes.EndPos <= nSrcPos ) - { // ?!? + { + // Could not parse anything meaningful. + assert(!aRes.TokenType); nErr = FormulaError::IllegalChar; SetError( nErr ); - nSrcPos = aFormula.getLength(); - aSymbol.truncate(); + // Caller has to act on an empty symbol for + // nSrcPos < aFormula.getLength() + nSrcPos = nOldSrcPos; + aSymbol.setLength(0); } else { @@ -4117,7 +4122,22 @@ bool ScCompiler::NextNewToken( bool bInArray ) sal_Int32 nSpaces = NextSymbol(bInArray); if (!cSymbol[0]) + { + if (nSrcPos < aFormula.getLength()) + { + // Nothing could be parsed, remainder as bad string. + // NextSymbol() must had set an error for this. + assert( pArr->GetCodeError() != FormulaError::NONE); + const OUString aBad( aFormula.copy( nSrcPos)); + svl::SharedString aSS = pDoc->GetSharedStringPool().intern( aBad); + maRawToken.SetString( aSS.getData(), aSS.getDataIgnoreCase()); + maRawToken.NewOpCode( ocBad); + nSrcPos = aFormula.getLength(); + // Add bad string as last token. + return true; + } return false; + } if( nSpaces ) { |