summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2017-08-11 10:58:43 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-08-11 16:29:33 +0200
commit6ff9371a30e972d3e9baad00b23e26cd8ff445dc (patch)
tree958dd32ad611285616e275b110b29bd1767d0c14
parentc69ebc21a85298169e714eba95cdd7288958902e (diff)
tdf#105705 sw: fix another case of bookmarks becoming un-sorted
The loop in SwTextNode::Update() that reassigns bookmark end positions away from the node to a temporary SwIndexReg can stop prematurely in a particular situation where there is a bookmark that is expanded and with both mark positions at the critical "rPos" insertion position, and also both their SwIndexes consecutive in the SwIndexReg::m_pFirst linked-list. What happens then is that the iteration gets to the first of the 2 consecutive positions of the bookmark, then calls GetMarkEnd() on the mark, which happens to return the other position, which is already stored in the "next" local variable. That other position is then moved to aTmpIdxReg, and in the next loop iteration GetNext() is null as it is the last one in aTmpIdxReg and the loop terminates. Thus various bookmark end positions don't get preserved, or the bAtLeastOneExpandedBookmarkAtInsertionPosition doesn't get set, either of which can cause the bookmark array to lose its sort order. This was found playing around with Zotero 4.0.29.10, while switching between different citation styles. (regression from 6a5dbe73537642b06bcde782118a34b4593d17eb) Change-Id: Ia35ce0656bcb2d6af7ea189458af3942ff83e4da (cherry picked from commit f78aadea74b99ba71f930c7cf52352da9ee965e9) Reviewed-on: https://gerrit.libreoffice.org/41015 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r--sw/source/core/txtnode/ndtxt.cxx4
1 files changed, 4 insertions, 0 deletions
diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx
index 2ae3720dd6ae..6f9092e9295d 100644
--- a/sw/source/core/txtnode/ndtxt.cxx
+++ b/sw/source/core/txtnode/ndtxt.cxx
@@ -1088,6 +1088,10 @@ void SwTextNode::Update(
if( this == &pEnd->nNode.GetNode() &&
rPos.GetIndex() == rEndIdx.GetIndex() )
{
+ if (&rEndIdx == next) // nasty corner case:
+ { // don't switch to iterating aTmpIdxReg!
+ next = rEndIdx.GetNext();
+ }
rEndIdx.Assign( &aTmpIdxReg, rEndIdx.GetIndex() );
bAtLeastOneBookmarkMoved = true;
}