diff options
author | Eike Rathke <erack@redhat.com> | 2022-06-13 19:38:59 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2022-06-14 01:07:46 +0200 |
commit | d6331fc7abe545ff0a369c41ab3f55b8f44a2cc1 (patch) | |
tree | 292429adb33e9b771ffe460290f8ad492c58fcd1 /sc/source/ui/vba | |
parent | d0fb2e4c2d5eb23b2a278e532d16e0652070a05b (diff) |
Related: tdf#149325 Eliminate all unconditional ScRangeList::front() access
... to prevent crashes, and where possible substitute a missing
element with the original sheet object range.
Change-Id: I245844e89fa3eb7d6ec07e279bdd23022fd77958
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135773
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
Diffstat (limited to 'sc/source/ui/vba')
-rw-r--r-- | sc/source/ui/vba/vbarange.cxx | 57 | ||||
-rw-r--r-- | sc/source/ui/vba/vbarange.hxx | 2 |
2 files changed, 33 insertions, 26 deletions
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx index 44e565700f71..d277d444901b 100644 --- a/sc/source/ui/vba/vbarange.cxx +++ b/sc/source/ui/vba/vbarange.cxx @@ -874,15 +874,18 @@ protected: ScCellRangesBase* pUnoRangesBase = dynamic_cast< ScCellRangesBase* >( xIf.get() ); if ( pUnoRangesBase ) { - ScRangeList aCellRanges = pUnoRangesBase->GetRangeList(); - ScCompiler aCompiler( m_rDoc, aCellRanges.front().aStart, m_eGrammar ); - // compile the string in the format passed in - std::unique_ptr<ScTokenArray> pArray(aCompiler.CompileString(sFormula)); - // convert to API grammar - aCompiler.SetGrammar( formula::FormulaGrammar::GRAM_API ); - OUString sConverted; - aCompiler.CreateStringFromTokenArray(sConverted); - sFormula = EQUALS + sConverted; + const ScRangeList& rCellRanges = pUnoRangesBase->GetRangeList(); + if (!rCellRanges.empty()) + { + ScCompiler aCompiler( m_rDoc, rCellRanges.front().aStart, m_eGrammar ); + // compile the string in the format passed in + std::unique_ptr<ScTokenArray> pArray(aCompiler.CompileString(sFormula)); + // convert to API grammar + aCompiler.SetGrammar( formula::FormulaGrammar::GRAM_API ); + OUString sConverted; + aCompiler.CreateStringFromTokenArray(sConverted); + sFormula = EQUALS + sConverted; + } } } @@ -920,16 +923,19 @@ public: { OUString sVal; aValue >>= sVal; - ScRangeList aCellRanges = pUnoRangesBase->GetRangeList(); - // Compile string from API grammar. - ScCompiler aCompiler( m_rDoc, aCellRanges.front().aStart, formula::FormulaGrammar::GRAM_API ); - std::unique_ptr<ScTokenArray> pArray(aCompiler.CompileString(sVal)); - // Convert to desired grammar. - aCompiler.SetGrammar( m_eGrammar ); - OUString sConverted; - aCompiler.CreateStringFromTokenArray(sConverted); - sVal = EQUALS + sConverted; - aValue <<= sVal; + const ScRangeList& rCellRanges = pUnoRangesBase->GetRangeList(); + if (!rCellRanges.empty()) + { + // Compile string from API grammar. + ScCompiler aCompiler( m_rDoc, rCellRanges.front().aStart, formula::FormulaGrammar::GRAM_API ); + std::unique_ptr<ScTokenArray> pArray(aCompiler.CompileString(sVal)); + // Convert to desired grammar. + aCompiler.SetGrammar( m_eGrammar ); + OUString sConverted; + aCompiler.CreateStringFromTokenArray(sConverted); + sVal = EQUALS + sConverted; + aValue <<= sVal; + } } } @@ -1923,7 +1929,8 @@ ScVbaRange::Offset( const ::uno::Any &nRowOff, const uno::Any &nColOff ) return new ScVbaRange( mxParent, mxContext, xRanges ); } // normal range - uno::Reference< table::XCellRange > xRange( new ScCellRangeObj( pUnoRangesBase->GetDocShell(), aCellRanges.front() ) ); + const ScRange aRange( obtainRangeEvenIfRangeListIsEmpty( aCellRanges)); + uno::Reference< table::XCellRange > xRange( new ScCellRangeObj( pUnoRangesBase->GetDocShell(), aRange)); return new ScVbaRange( mxParent, mxContext, xRange ); } @@ -2374,12 +2381,11 @@ ScVbaRange::Activate() } -ScRange ScVbaRange::obtainRangeEvenIfRangeListIsEmpty( const ScCellRangesBase* pUnoRangesBase ) const +ScRange ScVbaRange::obtainRangeEvenIfRangeListIsEmpty( const ScRangeList& rCellRanges ) const { // XXX It may be that using the current range list was never correct, but // always the initial sheet range would be instead, history is unclear. - const ScRangeList& rCellRanges = pUnoRangesBase->GetRangeList(); if (!rCellRanges.empty()) return rCellRanges.front(); @@ -2393,7 +2399,7 @@ ScVbaRange::Rows(const uno::Any& aIndex ) if ( aIndex.hasValue() ) { ScCellRangesBase* pUnoRangesBase = getCellRangesBase(); - ScRange aRange( obtainRangeEvenIfRangeListIsEmpty( pUnoRangesBase)); + ScRange aRange( obtainRangeEvenIfRangeListIsEmpty( pUnoRangesBase->GetRangeList())); sal_Int32 nValue = 0; OUString sAddress; @@ -2432,7 +2438,7 @@ uno::Reference< excel::XRange > ScVbaRange::Columns(const uno::Any& aIndex ) { ScCellRangesBase* pUnoRangesBase = getCellRangesBase(); - ScRange aRange( obtainRangeEvenIfRangeListIsEmpty( pUnoRangesBase)); + ScRange aRange( obtainRangeEvenIfRangeListIsEmpty( pUnoRangesBase->GetRangeList())); if ( aIndex.hasValue() ) { @@ -2946,7 +2952,8 @@ ScVbaRange::getEntireColumnOrRow( bool bColumn ) return new ScVbaRange( mxParent, mxContext, xRanges, !bColumn, bColumn ); } - uno::Reference< table::XCellRange > xRange( new ScCellRangeObj( pUnoRangesBase->GetDocShell(), aCellRanges.front() ) ); + const ScRange aRange( obtainRangeEvenIfRangeListIsEmpty( aCellRanges)); + uno::Reference< table::XCellRange > xRange( new ScCellRangeObj( pUnoRangesBase->GetDocShell(), aRange)); return new ScVbaRange( mxParent, mxContext, xRange, !bColumn, bColumn ); } diff --git a/sc/source/ui/vba/vbarange.hxx b/sc/source/ui/vba/vbarange.hxx index a893115d3a75..118ad044cf47 100644 --- a/sc/source/ui/vba/vbarange.hxx +++ b/sc/source/ui/vba/vbarange.hxx @@ -120,7 +120,7 @@ class ScVbaRange : public ScVbaRange_BASE void fireChangeEvent(); /// @throws css::uno::RuntimeException - ScRange obtainRangeEvenIfRangeListIsEmpty( const ScCellRangesBase* pUnoRangesBase ) const; + ScRange obtainRangeEvenIfRangeListIsEmpty( const ScRangeList& rCellRanges ) const; protected: virtual ScCellRangesBase* getCellRangesBase() override; |