From 7d6f30d04c51088b26815c241a7473c48822c6c3 Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Tue, 29 Jan 2019 15:25:52 +0100 Subject: 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 Tested-by: Jenkins --- sc/source/core/tool/compiler.cxx | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index bad18be255ff..e9555399af45 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 ) { -- cgit