summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <michael.stahl@allotropia.de>2022-08-08 16:12:14 +0200
committerCaolán McNamara <caolanm@redhat.com>2022-08-12 10:27:45 +0200
commit73cae0b440a3126af3c448d867d4ceebdfcc278c (patch)
tree628de4a6600806856ff19a159485b7f6d010e003 /sw
parent9480ac658ec8ddb445f629b4db66fce07649feab (diff)
sw_fieldmarkhide: fix crash on exporting forum-mso-en-4034.docx to ODT
The problem is that there's a field in a preceding paragraph that ends immediately before another field starts, and so the backwards iteration erroneously picks it up in ModelToViewHelper ctor. Change-Id: I6e65c04e0372377b3af48f1d80de287b6113e1c3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137986 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de> (cherry picked from commit 4f62ae798cc1f9f7bc524e408fc7a370345b40a8) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138026 Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/txtnode/modeltoviewhelper.cxx12
1 files changed, 10 insertions, 2 deletions
diff --git a/sw/source/core/txtnode/modeltoviewhelper.cxx b/sw/source/core/txtnode/modeltoviewhelper.cxx
index 1f35cd1ee614..8f0d5ccd7676 100644
--- a/sw/source/core/txtnode/modeltoviewhelper.cxx
+++ b/sw/source/core/txtnode/modeltoviewhelper.cxx
@@ -140,8 +140,16 @@ ModelToViewHelper::ModelToViewHelper(const SwTextNode &rNode,
// skip it, must be handled in loop below
if (pFieldMark->GetMarkStart().nNode < rNode)
{
- SwPosition const sepPos(::sw::mark::FindFieldSep(*pFieldMark));
- startedFields.emplace_front(pFieldMark, sepPos.nNode < rNode);
+ // this can be a nested field's end - skip over those!
+ if (pFieldMark->GetMarkEnd().nNode < rNode)
+ {
+ assert(cursor.GetPoint()->nNode.GetNode().GetTextNode()->GetText()[cursor.GetPoint()->nContent.GetIndex()] == CH_TXT_ATR_FIELDEND);
+ }
+ else
+ {
+ SwPosition const sepPos(::sw::mark::FindFieldSep(*pFieldMark));
+ startedFields.emplace_front(pFieldMark, sepPos.nNode < rNode);
+ }
*cursor.GetPoint() = pFieldMark->GetMarkStart();
}
if (!cursor.Move(fnMoveBackward, GoInContent))