sc/qa/unit/ucalc.cxx            |   31 +++++++++++++++++++++++++++++++
 sc/source/core/data/column4.cxx |   35 +++++++++++++++++++++++++----------
 2 files changed, 56 insertions(+), 10 deletions(-)

New commits:
commit 36bcab7859b7dfa1f1377bb5865c881742f178dd
Author: Kohei Yoshida <kohei.yosh...@collabora.com>
Date:   Thu Mar 13 16:08:03 2014 -0400

    fdo#76132: Don't create a formula group of length 1.
    
    That's asking for trouble.
    
    Change-Id: I6aaa4d1e2aed4f166ee216c3eb02d3b7794c9a8c

diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx
index fa18818..2f21623 100644
--- a/sc/source/core/data/column4.cxx
+++ b/sc/source/core/data/column4.cxx
@@ -334,25 +334,40 @@ void ScColumn::CloneFormulaCell( const ScFormulaCell& 
rSrc, const std::vector<sc
     {
         SCROW nRow1 = itSpan->mnRow1, nRow2 = itSpan->mnRow2;
         size_t nLen = nRow2 - nRow1 + 1;
+        assert(nLen > 0);
         aFormulas.clear();
         aFormulas.reserve(nLen);
 
         ScAddress aPos(nCol, nRow1, nTab);
-        ScFormulaCellGroupRef xGroup(new ScFormulaCellGroup);
-        xGroup->setCode(*rSrc.GetCode());
-        xGroup->compileCode(*pDocument, aPos, pDocument->GetGrammar());
-        for (size_t i = 0; i < nLen; ++i, aPos.IncRow())
+
+        if (nLen == 1)
         {
-            ScFormulaCell* pCell = new ScFormulaCell(pDocument, aPos, xGroup);
-            if (i == 0)
-            {
-                xGroup->mpTopCell = pCell;
-                xGroup->mnLength = nLen;
-            }
+            // Single, ungrouped formula cell.
+            ScFormulaCell* pCell =
+                new ScFormulaCell(rSrc, *pDocument, aPos, 
pDocument->GetGrammar());
             pCell->StartListeningTo(aCxt);
             pCell->SetDirty();
             aFormulas.push_back(pCell);
         }
+        else
+        {
+            // Create a group of formula cells.
+            ScFormulaCellGroupRef xGroup(new ScFormulaCellGroup);
+            xGroup->setCode(*rSrc.GetCode());
+            xGroup->compileCode(*pDocument, aPos, pDocument->GetGrammar());
+            for (size_t i = 0; i < nLen; ++i, aPos.IncRow())
+            {
+                ScFormulaCell* pCell = new ScFormulaCell(pDocument, aPos, 
xGroup);
+                if (i == 0)
+                {
+                    xGroup->mpTopCell = pCell;
+                    xGroup->mnLength = nLen;
+                }
+                pCell->StartListeningTo(aCxt);
+                pCell->SetDirty();
+                aFormulas.push_back(pCell);
+            }
+        }
 
         itPos = maCells.set(itPos, nRow1, aFormulas.begin(), aFormulas.end());
 
commit ce524556df4bf06cde1229475b9de9822a89f62b
Author: Kohei Yoshida <kohei.yosh...@collabora.com>
Date:   Thu Mar 13 14:43:06 2014 -0400

    fdo#76132: Write test for this first.
    
    The crash is a result of the pasted formula cell (single cell) being marked
    "shared", which should never happen.
    
    Change-Id: I7b7fa536c520c76b56cce78457e11b6e2eaee76f

diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index ed5e894..c903f4f 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -3765,6 +3765,37 @@ void Test::testCopyPasteRelativeFormula()
     // B2 references A2, so the value should be 1.
     CPPUNIT_ASSERT_EQUAL(1.0, m_pDoc->GetValue(ScAddress(1,1,0)));
 
+    // Clear content and start over.
+    clearSheet(m_pDoc, 0);
+    clearSheet(&aClipDoc, 0);
+
+    // Insert a single formula cell in A1.
+    m_pDoc->SetString(ScAddress(0,0,0), "=ROW()");
+    const ScFormulaCell* pFC = m_pDoc->GetFormulaCell(ScAddress(0,0,0));
+    CPPUNIT_ASSERT(pFC);
+    CPPUNIT_ASSERT(!pFC->IsShared()); // single formula cell is never shared.
+
+    // Copy A1 to clipboard.
+    aClipParam = ScClipParam(ScAddress(0,0,0), false);
+    m_pDoc->CopyToClip(aClipParam, &aClipDoc, &aMark);
+
+    pFC = aClipDoc.GetFormulaCell(ScAddress(0,0,0));
+    CPPUNIT_ASSERT(pFC);
+    CPPUNIT_ASSERT(!pFC->IsShared());
+
+    // Paste to A3.
+    aDestRange = ScRange(0,2,0,0,2,0);
+    aMark.SetMarkArea(aDestRange);
+    m_pDoc->CopyFromClip(aDestRange, aMark, nFlags, NULL, &aClipDoc);
+
+    pFC = m_pDoc->GetFormulaCell(ScAddress(0,2,0));
+    CPPUNIT_ASSERT(pFC);
+    CPPUNIT_ASSERT(!pFC->IsShared());
+
+    // Delete A3 and make sure it doesn't crash (see fdo#76132).
+    clearRange(m_pDoc, ScAddress(0,2,0));
+    CPPUNIT_ASSERT(m_pDoc->GetCellType(ScAddress(0,2,0)) == CELLTYPE_NONE);
+
     m_pDoc->DeleteTab(0);
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to