sw/source/core/txtnode/modeltoviewhelper.cxx |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

New commits:
commit 73cae0b440a3126af3c448d867d4ceebdfcc278c
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Mon Aug 8 16:12:14 2022 +0200
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Fri Aug 12 10:27:45 2022 +0200

    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.st...@allotropia.de>
    (cherry picked from commit 4f62ae798cc1f9f7bc524e408fc7a370345b40a8)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138026
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

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

Reply via email to