diff options
author | Eike Rathke <erack@redhat.com> | 2017-01-05 18:23:04 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2017-01-06 00:47:43 +0000 |
commit | 049862c9dd426eef74e229aee619facb98c7e7da (patch) | |
tree | dbd5a1da79d9a0dd3b9ce38cd9e6ab3110e61399 | |
parent | a34de7f0e4165db1a64be42044f9d5900d0d3da9 (diff) |
check "#ERRxxx!" constants for accepted error values, tdf#105024 follow-up
Change-Id: I9a11695710baa2f4e022c8e07f01b962cfabe2e7
(cherry picked from commit 6b89bcf85a911d043c9d93e843be12e6f23adedd)
Reviewed-on: https://gerrit.libreoffice.org/32763
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 2 | ||||
-rw-r--r-- | include/formula/errorcodes.hxx | 67 |
2 files changed, 68 insertions, 1 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 9e23149d2dd4..66c92fb08e3f 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -1192,7 +1192,7 @@ FormulaError FormulaCompiler::GetErrorConstant( const OUString& rName ) const if (rName.startsWithIgnoreAsciiCase("#ERR") && rName[rName.getLength()-1] == '!') { sal_uInt32 nErr = rName.copy( 4, rName.getLength() - 5).toUInt32(); - if (0 < nErr && nErr <= SAL_MAX_UINT16) + if (0 < nErr && nErr <= SAL_MAX_UINT16 && isPublishedFormulaError(static_cast<FormulaError>(nErr))) nError = static_cast<FormulaError>(nErr); } } diff --git a/include/formula/errorcodes.hxx b/include/formula/errorcodes.hxx index 329be0d3b24d..2af9b1112de7 100644 --- a/include/formula/errorcodes.hxx +++ b/include/formula/errorcodes.hxx @@ -119,6 +119,73 @@ inline FormulaError GetDoubleErrorValue( double fVal ) return (FormulaError)(nErr & 0x0000ffff); } +/** Error values that are accepted as detailed "#ERRxxx!" constants. + + Used in FormulaCompiler::GetErrorConstant() to prevent users from inventing + arbitrary values that already have or later might get a significant meaning. + */ +inline bool isPublishedFormulaError( FormulaError nErr ) +{ + // Every value has to be handled explicitly, do not add a default case to + // let the compiler complain if a value is missing. + switch (nErr) + { + case FormulaError::NONE: + return false; + + case FormulaError::IllegalChar: + case FormulaError::IllegalArgument: + case FormulaError::IllegalFPOperation: + case FormulaError::IllegalParameter: + case FormulaError::IllegalJump: + case FormulaError::Separator: + case FormulaError::Pair: + case FormulaError::PairExpected: + case FormulaError::OperatorExpected: + case FormulaError::VariableExpected: + case FormulaError::ParameterExpected: + case FormulaError::CodeOverflow: + case FormulaError::StringOverflow: + case FormulaError::StackOverflow: + case FormulaError::UnknownState: + case FormulaError::UnknownVariable: + case FormulaError::UnknownOpCode: + case FormulaError::UnknownStackVariable: + case FormulaError::NoValue: + case FormulaError::UnknownToken: + case FormulaError::NoCode: + case FormulaError::CircularReference: + case FormulaError::NoConvergence: + case FormulaError::NoRef: + case FormulaError::NoName: + case FormulaError::DoubleRef: + return true; + + case FormulaError::TrackFromCircRef: + case FormulaError::CellNoValue: + return false; + + case FormulaError::NoAddin: + case FormulaError::NoMacro: + case FormulaError::DivisionByZero: + case FormulaError::NestedArray: + return true; + + case FormulaError::NotNumericString: + case FormulaError::JumpMatHasResult: + case FormulaError::ElementNaN: + case FormulaError::RetryCircular: + return false; + + case FormulaError::MatrixSize: + return true; + + case FormulaError::NotAvailable: + return false; + } + return false; +} + #endif // INCLUDED_FORMULA_ERRORCODES_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |