[Libreoffice-commits] core.git: Branch 'libreoffice-6-4' - sw/qa sw/source
Michael Stahl (via logerrit)
logerrit at kemper.freedesktop.org
Wed Aug 26 12:26:30 UTC 2020
sw/qa/extras/uiwriter/data/tdf132160.odt |binary
sw/qa/extras/uiwriter/uiwriter.cxx | 18 ++++++++++++++++++
sw/source/core/doc/DocumentRedlineManager.cxx | 5 +++++
3 files changed, 23 insertions(+)
New commits:
commit d0ebd31df55d6bec2a0a7f84978712e49b90b993
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Tue Aug 25 14:44:39 2020 +0200
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Wed Aug 26 14:25:57 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.stahl at cib.de>
(cherry picked from commit e2fe4fde592564d35099ad1e2659ad682dfb77f5)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101352
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/sw/qa/extras/uiwriter/data/tdf132160.odt b/sw/qa/extras/uiwriter/data/tdf132160.odt
new file mode 100644
index 000000000000..8a8ae7b8b1cb
Binary files /dev/null and b/sw/qa/extras/uiwriter/data/tdf132160.odt differ
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index c14306e233c9..be8a972a181a 100644
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -4231,6 +4231,24 @@ void SwUiWriterTest::testDde()
#endif
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest, 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
+ lcl_dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {});
+
+ // this would crash due to insert redline ending on table node
+ lcl_dispatchCommand(mxComponent, ".uno:Undo", {});
+
+ lcl_dispatchCommand(mxComponent, ".uno:Redo", {});
+
+ lcl_dispatchCommand(mxComponent, ".uno:Undo", {});
+}
+
//IdleTask class to add a low priority Idle task
class IdleTask
{
diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx b/sw/source/core/doc/DocumentRedlineManager.cxx
index 8e026a876dc9..ff9b05743d10 100644
--- a/sw/source/core/doc/DocumentRedlineManager.cxx
+++ b/sw/source/core/doc/DocumentRedlineManager.cxx
@@ -658,6 +658,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
More information about the Libreoffice-commits
mailing list