[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - sc/source

Eike Rathke erack at redhat.com
Mon Aug 17 03:50:04 PDT 2015


 sc/source/core/data/table3.cxx |   16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

New commits:
commit 7cbcde5e8727b84b4d3ca9f80020082644d9638a
Author: Eike Rathke <erack at 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
    (cherry picked from commit ea29d320754fdb21b336cb78f816b8081371def9)
    Reviewed-on: https://gerrit.libreoffice.org/17726
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 6b5f634..1c5a551 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -713,6 +713,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();
@@ -770,6 +771,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;
@@ -1085,7 +1096,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)
     {
@@ -1270,7 +1281,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)
     {


More information about the Libreoffice-commits mailing list