svtools/source/misc/embedhlp.cxx |   21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

New commits:
commit 8872f7121b4ae4dd0b51820366d3510a88f7aac2
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Tue Mar 26 21:42:51 2024 +0000
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Wed Mar 27 10:02:15 2024 +0100

    crashtesting: crash on exporting kde274105-6.docx to .rtf
    
    since:
    
    commit 9ae8e74fb32254c81d36b1c95411605459e06372
    Date:   Tue Mar 5 11:01:42 2024 -0700
    
        tdf#50934: Add a pie-with-remainder-as-another-pie chart type
    
    but this sort of problem has arisen before at:
    
    commit 3a2c2ad839860dcb36e30ae1a2867e4d5e1036fc
    Date:   Wed Jan 30 10:12:44 2019 +0000
    
        crashtesting: crash exporting ooo58458-1.odt to doc
    
        since...
    
        commit 8780fa41dcd164af244742461f4e57a4bcf4c7a4
        Date:   Tue Oct 30 12:23:36 2018 +0100
    
            svtools: fix lost replacement grpahic when updating it via OLE fails
    
    and back in:
    
    commit ca9dd36bb0f2f8a5bcb0e5621ec181cc6f29ad73
    Date:   Tue May 22 18:34:28 2007 +0000
    
        INTEGRATION: CWS chart2mst3 (1.16.4); FILE MERGED
        2006/08/04 09:32:02 iha 1.16.4.1: don't crash while resizing some 
charts when replacement graphic happens to be empty
    
    the same issue of charts triggering UpdateReplacementOnDemand on
    modifications which happen during generating the Replacement Graphic.
    
    Presumably no modifications should happen during this process and those
    are the underlying bugs.
    
    Change-Id: I27172a7bd62d836f8e47f826de3ea941881459bb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165358
    Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/svtools/source/misc/embedhlp.cxx b/svtools/source/misc/embedhlp.cxx
index d784b20a4a39..370d0f6b10ca 100644
--- a/svtools/source/misc/embedhlp.cxx
+++ b/svtools/source/misc/embedhlp.cxx
@@ -461,12 +461,10 @@ void EmbeddedObjectRef::GetReplacement( bool bUpdate )
 
         mpImpl->oGraphic.reset();
         mpImpl->aMediaType.clear();
-        mpImpl->oGraphic.emplace();
         mpImpl->mnGraphicVersion++;
     }
     else if ( !mpImpl->oGraphic )
     {
-        mpImpl->oGraphic.emplace();
         mpImpl->mnGraphicVersion++;
     }
     else
@@ -475,6 +473,8 @@ void EmbeddedObjectRef::GetReplacement( bool bUpdate )
         return;
     }
 
+    mpImpl->oGraphic.emplace();
+
     std::unique_ptr<SvStream> pGraphicStream(GetGraphicStream( bUpdate ));
     if (!pGraphicStream && aOldGraphic.IsNone())
     {
@@ -485,17 +485,24 @@ void EmbeddedObjectRef::GetReplacement( bool bUpdate )
                  "EmbeddedObjectRef::GetReplacement: failed to get updated 
graphic stream");
     }
 
+    if (!mpImpl->oGraphic)
+    {
+        // note that UpdateReplacementOnDemand which resets mpImpl->oGraphic 
to null may have been called
+        // e.g. when exporting ooo58458-1.odt to doc or kde274105-6.docx to 
rtf. Those looks like bugs as
+        // presumably generating the replacement graphic shouldn't re-trigger 
that the graphic needs
+        // to be updated, bodge this to work as callers naturally expect
+        SAL_WARN("svtools.misc", "EmbeddedObjectRef::GetReplacement generating 
replacement image modified object to claim it needs to update replacement");
+        mpImpl->oGraphic.emplace();
+    }
+
     if ( pGraphicStream )
     {
         GraphicFilter& rGF = GraphicFilter::GetGraphicFilter();
-        if( mpImpl->oGraphic )
-            rGF.ImportGraphic( *mpImpl->oGraphic, u"", *pGraphicStream );
+        rGF.ImportGraphic( *mpImpl->oGraphic, u"", *pGraphicStream );
         mpImpl->mnGraphicVersion++;
     }
 
-    // note that UpdateReplacementOnDemand which resets mpImpl->oGraphic to 
null may have been called
-    // e.g. when exporting ooo58458-1.odt to doc
-    if (bUpdate && (!mpImpl->oGraphic || mpImpl->oGraphic->IsNone()) && 
!aOldGraphic.IsNone())
+    if (bUpdate && mpImpl->oGraphic->IsNone() && !aOldGraphic.IsNone())
     {
         // We used to have an old graphic, tried to update and the update
         // failed. Go back to the old graphic instead of having no graphic at

Reply via email to