Kaydet (Commit) f78aadea authored tarafından Michael Stahl's avatar Michael Stahl

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 6a5dbe73)

Change-Id: Ia35ce0656bcb2d6af7ea189458af3942ff83e4da
üst 469369b3
......@@ -1087,6 +1087,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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment