sc/inc/column.hxx | 11 +++++++++-- sc/inc/document.hxx | 8 +++++++- sc/inc/table.hxx | 8 +++++++- sc/source/core/data/column3.cxx | 8 ++++++-- sc/source/core/data/documen2.cxx | 6 +++--- sc/source/core/data/table2.cxx | 6 +++--- sc/source/filter/excel/excform.cxx | 2 +- sc/source/filter/xml/xmlcelli.cxx | 5 +++-- sc/source/ui/unoobj/funcuno.cxx | 6 +++--- 9 files changed, 42 insertions(+), 18 deletions(-)
New commits: commit 4d676f72bc0f1928be0e6bc2f272291f278dc95a Author: Caolán McNamara <caol...@redhat.com> Date: Tue Jun 25 17:29:24 2013 +0100 coverity#1038508 Use after free (USE_AFTER_FREE) ** CID 1038508: Use after free (USE_AFTER_FREE) ** CID 1038509: Use after free (USE_AFTER_FREE) ** CID 1038510: Use after free (USE_AFTER_FREE) Change-Id: I3a1422e252af415536d9303e58ff85763c231921 diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index e7c58c1..23e3a16 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -255,8 +255,15 @@ public: void SetEditText( SCROW nRow, const EditTextObject& rEditText, const SfxItemPool* pEditPool ); void SetFormula( SCROW nRow, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGram ); void SetFormula( SCROW nRow, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram ); - void SetFormulaCell( SCROW nRow, ScFormulaCell* pCell ); - void SetFormulaCell( sc::ColumnBlockPosition& rBlockPos, SCROW nRow, ScFormulaCell* pCell ); + + /** + * Takes ownership of pCell + * + * @return pCell if it was successfully inserted, NULL otherwise. pCell + * is deleted automatically on failure to insert. + */ + ScFormulaCell* SetFormulaCell( SCROW nRow, ScFormulaCell* pCell ); + ScFormulaCell* SetFormulaCell( sc::ColumnBlockPosition& rBlockPos, SCROW nRow, ScFormulaCell* pCell ); void SetRawString( SCROW nRow, const OUString& rStr, bool bBroadcast = true ); void SetRawString( sc::ColumnBlockPosition& rBlockPos, SCROW nRow, const OUString& rStr, bool bBroadcast = true ); diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 08c4ab6..ff0b869 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -792,7 +792,13 @@ public: const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram = formula::FormulaGrammar::GRAM_DEFAULT ); - SC_DLLPUBLIC void SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ); + /** + * Takes ownership of pCell + * + * @return pCell if it was successfully inserted, NULL otherwise. pCell + * is deleted automatically on failure to insert. + */ + SC_DLLPUBLIC ScFormulaCell* SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ); SC_DLLPUBLIC void InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 65cb180..15f04e5 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -324,7 +324,13 @@ public: void SetFormula( SCCOL nCol, SCROW nRow, const OUString& rFormula, formula::FormulaGrammar::Grammar eGram ); - void SetFormulaCell( SCCOL nCol, SCROW nRow, ScFormulaCell* pCell ); + /** + * Takes ownership of pCell + * + * @return pCell if it was successfully inserted, NULL otherwise. pCell + * is deleted automatically on failure to insert. + */ + ScFormulaCell* SetFormulaCell( SCCOL nCol, SCROW nRow, ScFormulaCell* pCell ); void SetValue( SCCOL nCol, SCROW nRow, const double& rVal ); void SetError( SCCOL nCol, SCROW nRow, sal_uInt16 nError); diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index 11c4474..861984e 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -1699,7 +1699,7 @@ void ScColumn::SetFormula( SCROW nRow, const OUString& rFormula, formula::Formul ActivateNewFormulaCell(pCell); } -void ScColumn::SetFormulaCell( SCROW nRow, ScFormulaCell* pCell ) +ScFormulaCell* ScColumn::SetFormulaCell( SCROW nRow, ScFormulaCell* pCell ) { sc::CellStoreType::iterator it = GetPositionToInsert(nRow); maCells.set(it, nRow, pCell); @@ -1707,9 +1707,11 @@ void ScColumn::SetFormulaCell( SCROW nRow, ScFormulaCell* pCell ) CellStorageModified(); ActivateNewFormulaCell(pCell); + + return pCell; } -void ScColumn::SetFormulaCell( sc::ColumnBlockPosition& rBlockPos, SCROW nRow, ScFormulaCell* pCell ) +ScFormulaCell* ScColumn::SetFormulaCell( sc::ColumnBlockPosition& rBlockPos, SCROW nRow, ScFormulaCell* pCell ) { rBlockPos.miCellPos = GetPositionToInsert(rBlockPos.miCellPos, nRow); rBlockPos.miCellPos = maCells.set(rBlockPos.miCellPos, nRow, pCell); @@ -1718,6 +1720,8 @@ void ScColumn::SetFormulaCell( sc::ColumnBlockPosition& rBlockPos, SCROW nRow, S CellStorageModified(); ActivateNewFormulaCell(pCell); + + return pCell; } namespace { diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index 7046194..b1b3160 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -1054,15 +1054,15 @@ void ScDocument::SetFormula( maTabs[rPos.Tab()]->SetFormula(rPos.Col(), rPos.Row(), rFormula, eGram); } -void ScDocument::SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ) +ScFormulaCell* ScDocument::SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ) { if (!TableExists(rPos.Tab())) { delete pCell; - return; + return NULL; } - maTabs[rPos.Tab()]->SetFormulaCell(rPos.Col(), rPos.Row(), pCell); + return maTabs[rPos.Tab()]->SetFormulaCell(rPos.Col(), rPos.Row(), pCell); } void ScDocument::SetConsolidateDlgData( const ScConsolidateParam* pData ) diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 3d7b746..cec4679 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -1438,15 +1438,15 @@ void ScTable::SetFormula( aCol[nCol].SetFormula(nRow, rFormula, eGram); } -void ScTable::SetFormulaCell( SCCOL nCol, SCROW nRow, ScFormulaCell* pCell ) +ScFormulaCell* ScTable::SetFormulaCell( SCCOL nCol, SCROW nRow, ScFormulaCell* pCell ) { if (!ValidColRow(nCol, nRow)) { delete pCell; - return; + return NULL; } - aCol[nCol].SetFormulaCell(nRow, pCell); + return aCol[nCol].SetFormulaCell(nRow, pCell); } void ScTable::SetValue( SCCOL nCol, SCROW nRow, const double& rVal ) diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx index 3cb4367..10b95f7 100644 --- a/sc/source/filter/excel/excform.cxx +++ b/sc/source/filter/excel/excform.cxx @@ -124,7 +124,7 @@ void ImportExcel::Formula( { pCell = new ScFormulaCell( pD, aScPos, pResult ); pD->EnsureTable(aScPos.Tab()); - pD->SetFormulaCell(aScPos, pCell); + pCell = pD->SetFormulaCell(aScPos, pCell); } else { diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index 0fef98f..4ab9d98 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -1344,8 +1344,9 @@ void ScXMLTableRowCellContext::PutFormulaCell( const ScAddress& rCellPos ) pDoc->IncXMLImportedFormulaCount( aText.getLength() ); ScFormulaCell* pNewCell = new ScFormulaCell(pDoc, rCellPos, pCode.get(), eGrammar, MM_NONE); SetFormulaCell(pNewCell); - pDoc->SetFormulaCell(rCellPos, pNewCell); - pNewCell->SetNeedNumberFormat( true ); + pNewCell = pDoc->SetFormulaCell(rCellPos, pNewCell); + if (pNewCell) + pNewCell->SetNeedNumberFormat( true ); } else if ( aText[0] == '\'' && aText.getLength() > 1 ) { diff --git a/sc/source/ui/unoobj/funcuno.cxx b/sc/source/ui/unoobj/funcuno.cxx index 7c57ee9..1090ea1 100644 --- a/sc/source/ui/unoobj/funcuno.cxx +++ b/sc/source/ui/unoobj/funcuno.cxx @@ -653,13 +653,13 @@ uno::Any SAL_CALL ScFunctionAccess::callFunction( const OUString& aName, // other API compatibility grammars. ScFormulaCell* pFormula = new ScFormulaCell( pDoc, aFormulaPos, &aTokenArr, formula::FormulaGrammar::GRAM_PODF_A1, (sal_uInt8)(mbArray ? MM_FORMULA : MM_NONE) ); - pDoc->SetFormulaCell(aFormulaPos, pFormula); + pFormula = pDoc->SetFormulaCell(aFormulaPos, pFormula); // call GetMatrix before GetErrCode because GetMatrix always recalculates // if there is no matrix result - const ScMatrix* pMat = mbArray ? pFormula->GetMatrix() : 0; - sal_uInt16 nErrCode = pFormula->GetErrCode(); + const ScMatrix* pMat = (mbArray && pFormula) ? pFormula->GetMatrix() : 0; + sal_uInt16 nErrCode = pFormula ? pFormula->GetErrCode() : errIllegalArgument; if ( nErrCode == 0 ) { if ( pMat )
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits