sw/qa/extras/uiwriter/data2/tdf132160.odt     |binary
 sw/qa/extras/uiwriter/uiwriter2.cxx           |   18 ++++++++++++++++++
 sw/source/core/doc/DocumentRedlineManager.cxx |    5 +++++
 3 files changed, 23 insertions(+)

New commits:
commit d172e9eeff21851670fd5da7c585a9ca46e02253
Author:     Michael Stahl <michael.st...@cib.de>
AuthorDate: Tue Aug 25 14:44:39 2020 +0200
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Wed Aug 26 10:58:47 2020 +0200

    (related: tdf#132160) sw: fix lcl_RejectRedline if end is on table node
    
    This happens on Undo:
    
    sw/source/core/undo/undobj.cxx:1394: void 
SwRedlineSaveData::RedlineToDoc(const SwPaM&): Assertion `result != 
IDocumentRedlineAccess::AppendResult::IGNORED' failed.
    
    Because the SwRedlineSaveData was created in SwUndoDelete ctor from
    this:
    
    (rr) p *pRedl
    $18 = (SwRangeRedline) {
      <SwPaM> = SwPaM = {
        point = SwPosition (node 13457, offset 0),
        mark = SwPosition (node 13455, offset 0)
      },
    (rr) p pRedl->GetPoint()->nNode.GetNode().GetNodes()[13457]
    $19 = (SwTableNode *) 0x80bdbe0
    
    DelFullPara() will delete the end node, see "m_rDoc.GetNodes().Delete(
    aRg.aStart, nNodeDiff+1 );" or equivalent in SwUndoDelete.
    
    So if the end is on a start node, set it back to the previous node,
    because deleting just a start node is a bad idea.
    
    Change-Id: Ib7c35c103ce05ede39e66505fa47fa70bfece018
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101334
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@cib.de>
    (cherry picked from commit e2fe4fde592564d35099ad1e2659ad682dfb77f5)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101351
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/sw/qa/extras/uiwriter/data2/tdf132160.odt 
b/sw/qa/extras/uiwriter/data2/tdf132160.odt
new file mode 100644
index 000000000000..8a8ae7b8b1cb
Binary files /dev/null and b/sw/qa/extras/uiwriter/data2/tdf132160.odt differ
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx 
b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 01d05d963b3c..3702ce76a15e 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -1706,6 +1706,24 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf122942)
     CPPUNIT_ASSERT(rOutRect2.Top() > rOutRect1.Top() && rOutRect2.Top() < 
rOutRect1.Bottom());
 }
 
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf132160)
+{
+    load(DATA_DIRECTORY, "tdf132160.odt");
+
+    SwXTextDocument* pTextDoc = 
dynamic_cast<SwXTextDocument*>(mxComponent.get());
+    CPPUNIT_ASSERT(pTextDoc);
+
+    // this would crash due to delete redline starting with ToX
+    dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {});
+
+    // this would crash due to insert redline ending on table node
+    dispatchCommand(mxComponent, ".uno:Undo", {});
+
+    dispatchCommand(mxComponent, ".uno:Redo", {});
+
+    dispatchCommand(mxComponent, ".uno:Undo", {});
+}
+
 CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf52391)
 {
     load(DATA_DIRECTORY, "tdf52391.fodt");
diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx 
b/sw/source/core/doc/DocumentRedlineManager.cxx
index ace591d95dae..f3aaa13a60d1 100644
--- a/sw/source/core/doc/DocumentRedlineManager.cxx
+++ b/sw/source/core/doc/DocumentRedlineManager.cxx
@@ -660,6 +660,11 @@ namespace
                         {
                             aPam.GetBound().nContent.Assign( nullptr, 0 );
                             aPam.GetBound( false ).nContent.Assign( nullptr, 0 
);
+                            if (aPam.End()->nNode.GetNode().IsStartNode())
+                            {   // end node will be deleted too! see 
nNodeDiff+1
+                                --aPam.End()->nNode;
+                            }
+                            assert(!aPam.End()->nNode.GetNode().IsStartNode());
                             rDoc.getIDocumentContentOperations().DelFullPara( 
aPam );
                         }
                     else
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to