sc/source/core/data/table3.cxx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
New commits: commit ea29d320754fdb21b336cb78f816b8081371def9 Author: Eike Rathke <er...@redhat.com> Date: Thu Aug 13 18:34:27 2015 +0200 Resolves: tdf#93098 replace remembered listener when replacing cell ... where SvtListener* is the base of ScFormulaCell* and lead to use after delete. Change-Id: I45b8e16f05cf5d4d0d4858dc9cd0c748f8184978 diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index 372e8da..0287e66 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -710,6 +710,7 @@ public: void fillSortedColumnArray( boost::ptr_vector<SortedColumn>& rSortedCols, SortedRowFlags& rRowFlags, + std::vector<SvtListener*>& rCellListeners, ScSortInfoArray* pArray, SCTAB nTab, SCCOL nCol1, SCCOL nCol2, ScProgress* pProgress ) { SCROW nRow1 = pArray->GetStart(); @@ -767,6 +768,16 @@ void fillSortedColumnArray( pNew->GetCode()->AdjustReferenceOnMovedOriginIfOtherSheet(aOldPos, aCellPos); } + if (!rCellListeners.empty()) + { + // Original source cells will be deleted during + // sc::CellStoreType::transfer(), SvtListener is a base + // class, so we need to replace it. + auto it( ::std::find( rCellListeners.begin(), rCellListeners.end(), rCell.maCell.mpFormula)); + if (it != rCellListeners.end()) + *it = pNew; + } + rCellStore.push_back(pNew); } break; @@ -1082,7 +1093,7 @@ void ScTable::SortReorderByRow( // a copy before updating the document. boost::ptr_vector<SortedColumn> aSortedCols; // storage for copied cells. SortedRowFlags aRowFlags; - fillSortedColumnArray(aSortedCols, aRowFlags, pArray, nTab, nCol1, nCol2, pProgress); + fillSortedColumnArray(aSortedCols, aRowFlags, aCellListeners, pArray, nTab, nCol1, nCol2, pProgress); for (size_t i = 0, n = aSortedCols.size(); i < n; ++i) { @@ -1267,7 +1278,8 @@ void ScTable::SortReorderByRowRefUpdate( // a copy before updating the document. boost::ptr_vector<SortedColumn> aSortedCols; // storage for copied cells. SortedRowFlags aRowFlags; - fillSortedColumnArray(aSortedCols, aRowFlags, pArray, nTab, nCol1, nCol2, pProgress); + std::vector<SvtListener*> aListenersDummy; + fillSortedColumnArray(aSortedCols, aRowFlags, aListenersDummy, pArray, nTab, nCol1, nCol2, pProgress); for (size_t i = 0, n = aSortedCols.size(); i < n; ++i) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits