filter/source/msfilter/msdffimp.cxx |  122 +++++++++++++++++-------------------
 1 file changed, 60 insertions(+), 62 deletions(-)

New commits:
commit 5bfbb64cb9ae102e5a1f5b4cd020d0cd006d0a92
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Apr 13 20:54:22 2022 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Apr 14 09:55:47 2022 +0200

    ofz#46630 Indirect leak
    
    Change-Id: I2af5f9e0b8ac210f6d1a7700ac6cb6213d706e19
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132986
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/filter/source/msfilter/msdffimp.cxx 
b/filter/source/msfilter/msdffimp.cxx
index 745a085c7dce..7fae12fc40ea 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -4214,13 +4214,11 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                                             tools::Rectangle& rClientRect, 
const tools::Rectangle& rGlobalChildRect,
                                             int nCalledByGroup, sal_Int32* 
pShapeId )
 {
-    SdrObject* pRet = nullptr;
-
     if( pShapeId )
         *pShapeId = 0;
 
     if (!rHd.SeekToBegOfRecord(rSt))
-        return pRet;
+        return nullptr;
 
     DffObjData aObjData( rHd, rClientRect, nCalledByGroup );
 
@@ -4271,7 +4269,7 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
     if ( aObjData.bOpt )
     {
         if (!maShapeRecords.Current()->SeekToBegOfRecord(rSt))
-            return pRet;
+            return nullptr;
 #ifdef DBG_AUTOSHAPE
         ReadPropSet( rSt, &rClientData, (sal_uInt32)aObjData.eShapeType );
 #else
@@ -4326,6 +4324,8 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
     if ( aObjData.nSpFlags & ShapeFlag::Background )
         aObjData.aBoundRect = tools::Rectangle( Point(), Size( 1, 1 ) );
 
+    SdrObjectUniquePtr xRet;
+
     tools::Rectangle aTextRect;
     if ( !aObjData.aBoundRect.IsEmpty() )
     {   // apply rotation to the BoundingBox BEFORE an object has been 
generated
@@ -4350,7 +4350,7 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
 
         if ( aObjData.nSpFlags & ShapeFlag::Group )
         {
-            pRet = new SdrObjGroup(*pSdrModel);
+            xRet.reset(new SdrObjGroup(*pSdrModel));
             /*  After CWS aw033 has been integrated, an empty group object
                 cannot store its resulting bounding rectangle anymore. We have
                 to return this rectangle via rClientRect now, but only, if
@@ -4370,9 +4370,9 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
             if ( bGraphic )
             {
                 if (!mbSkipImages) {
-                    pRet = ImportGraphic( rSt, aSet, aObjData );        // SJ: 
#68396# is no longer true (fixed in ppt2000)
+                    xRet.reset(ImportGraphic(rSt, aSet, aObjData));        // 
SJ: #68396# is no longer true (fixed in ppt2000)
                     ApplyAttributes( rSt, aSet, aObjData );
-                    pRet->SetMergedItemSet(aSet);
+                    xRet->SetMergedItemSet(aSet);
                 }
             }
             else if ( aObjData.eShapeType == mso_sptLine && !( 
GetPropertyValue( DFF_Prop_fc3DLightFace, 0 ) & 8 ) )
@@ -4380,12 +4380,12 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                 basegfx::B2DPolygon aPoly;
                 aPoly.append(basegfx::B2DPoint(aObjData.aBoundRect.Left(), 
aObjData.aBoundRect.Top()));
                 aPoly.append(basegfx::B2DPoint(aObjData.aBoundRect.Right(), 
aObjData.aBoundRect.Bottom()));
-                pRet = new SdrPathObj(
+                xRet.reset(new SdrPathObj(
                     *pSdrModel,
                     SdrObjKind::Line,
-                    basegfx::B2DPolyPolygon(aPoly));
+                    basegfx::B2DPolyPolygon(aPoly)));
                 ApplyAttributes( rSt, aSet, aObjData );
-                pRet->SetMergedItemSet(aSet);
+                xRet->SetMergedItemSet(aSet);
             }
             else
             {
@@ -4394,7 +4394,7 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
 
                     ApplyAttributes( rSt, aSet, aObjData );
 
-                    pRet = new SdrObjCustomShape(*pSdrModel);
+                    xRet.reset(new SdrObjCustomShape(*pSdrModel));
 
                     sal_uInt32 ngtextFStrikethrough = GetPropertyValue( 
DFF_Prop_gtextFStrikethrough, 0 );
                     bool bIsFontwork = ( ngtextFStrikethrough & 0x4000 ) != 0;
@@ -4430,12 +4430,12 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                         // this should be replaced through "CharacterRotation"
                         // by 90 degrees, therefore a new Item has to be
                         // supported by svx core, api and xml file format
-                        
static_cast<SdrObjCustomShape*>(pRet)->SetVerticalWriting( ( 
ngtextFStrikethrough & 0x2000 ) != 0 );
+                        
static_cast<SdrObjCustomShape*>(xRet.get())->SetVerticalWriting( ( 
ngtextFStrikethrough & 0x2000 ) != 0 );
 
                         if ( SeekToContent( DFF_Prop_gtextUNICODE, rSt ) )
                         {
                             aObjectText = MSDFFReadZString( rSt, 
GetPropertyValue( DFF_Prop_gtextUNICODE, 0 ), true );
-                            ReadObjText( aObjectText, pRet );
+                            ReadObjText(aObjectText, xRet.get());
                         }
 
                         auto eGeoTextAlign = 
GetPropertyValue(DFF_Prop_gtextAlign, mso_alignTextCenter);
@@ -4502,18 +4502,18 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                             }
                         }
                     }
-                    pRet->SetMergedItemSet( aSet );
+                    xRet->SetMergedItemSet( aSet );
 
                     // sj: taking care of rtl, ltr. In case of fontwork mso. 
seems not to be able to set
                     // proper text directions, instead the text default is 
depending to the string.
                     // so we have to calculate the a text direction from 
string:
                     if ( bIsFontwork )
                     {
-                        OutlinerParaObject* pParaObj = 
static_cast<SdrObjCustomShape*>(pRet)->GetOutlinerParaObject();
+                        OutlinerParaObject* pParaObj = 
static_cast<SdrObjCustomShape*>(xRet.get())->GetOutlinerParaObject();
                         if ( pParaObj )
                         {
-                            SdrOutliner& rOutliner = 
static_cast<SdrObjCustomShape*>(pRet)->ImpGetDrawOutliner();
-                            rOutliner.SetStyleSheetPool(static_cast< 
SfxStyleSheetPool* >(pRet->getSdrModelFromSdrObject().GetStyleSheetPool()));
+                            SdrOutliner& rOutliner = 
static_cast<SdrObjCustomShape*>(xRet.get())->ImpGetDrawOutliner();
+                            rOutliner.SetStyleSheetPool(static_cast< 
SfxStyleSheetPool* >(xRet->getSdrModelFromSdrObject().GetStyleSheetPool()));
                             bool bOldUpdateMode = rOutliner.SetUpdateLayout( 
false );
                             rOutliner.SetText( *pParaObj );
                             ScopedVclPtrInstance< VirtualDevice > 
pVirDev(DeviceFormat::DEFAULT);
@@ -4538,7 +4538,7 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                                 {
                                     std::optional<OutlinerParaObject> pNewText 
= rOutliner.CreateParaObject();
                                     rOutliner.Init( OutlinerMode::TextObject );
-                                    
static_cast<SdrObjCustomShape*>(pRet)->NbcSetOutlinerParaObject( 
std::move(pNewText) );
+                                    
static_cast<SdrObjCustomShape*>(xRet.get())->NbcSetOutlinerParaObject( 
std::move(pNewText) );
                                 }
                             }
                             rOutliner.Clear();
@@ -4555,7 +4555,7 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                         static const OUStringLiteral sAdjustmentValues( 
u"AdjustmentValues" );
                         static const OUStringLiteral sViewBox( u"ViewBox" );
                         static const OUStringLiteral sPath( u"Path" );
-                        SdrCustomShapeGeometryItem aGeometryItem( 
static_cast<SdrObjCustomShape*>(pRet)->GetMergedItem( 
SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
+                        SdrCustomShapeGeometryItem aGeometryItem( 
static_cast<SdrObjCustomShape*>(xRet.get())->GetMergedItem( 
SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
                         PropertyValue aPropVal;
 
                         // The default arc goes form -90deg to 0deg. Replace 
general defaults used
@@ -4747,56 +4747,55 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                         aGeometryItem.ClearPropertyValue( "Equations" );
                         aGeometryItem.ClearPropertyValue( sPath );
 
-                        static_cast<SdrObjCustomShape*>(pRet)->SetMergedItem( 
aGeometryItem );
-                        
static_cast<SdrObjCustomShape*>(pRet)->MergeDefaultAttributes();
+                        
static_cast<SdrObjCustomShape*>(xRet.get())->SetMergedItem( aGeometryItem );
+                        
static_cast<SdrObjCustomShape*>(xRet.get())->MergeDefaultAttributes();
 
                         // now setting a new name, so the above correction is 
only done once when importing from ms
-                        SdrCustomShapeGeometryItem aGeoName( 
static_cast<SdrObjCustomShape*>(pRet)->GetMergedItem( 
SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
+                        SdrCustomShapeGeometryItem aGeoName( 
static_cast<SdrObjCustomShape*>(xRet.get())->GetMergedItem( 
SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
                         aPropVal.Name = "Type";
                         aPropVal.Value <<= OUString( "mso-spt100" );
                         aGeoName.SetPropertyValue( aPropVal );
-                        static_cast<SdrObjCustomShape*>(pRet)->SetMergedItem( 
aGeoName );
+                        
static_cast<SdrObjCustomShape*>(xRet.get())->SetMergedItem( aGeoName );
                     }
                     else
-                        
static_cast<SdrObjCustomShape*>(pRet)->MergeDefaultAttributes();
+                        
static_cast<SdrObjCustomShape*>(xRet.get())->MergeDefaultAttributes();
 
-                    pRet->SetSnapRect( aObjData.aBoundRect );
-                    EnhancedCustomShape2d 
aCustomShape2d(static_cast<SdrObjCustomShape&>(*pRet));
+                    xRet->SetSnapRect( aObjData.aBoundRect );
+                    EnhancedCustomShape2d 
aCustomShape2d(static_cast<SdrObjCustomShape&>(*xRet));
                     aTextRect = aCustomShape2d.GetTextRect();
 
                     if( bIsConnector )
                     {
                         if( nObjectRotation )
-                            pRet->NbcRotate( aObjData.aBoundRect.Center(), 
nObjectRotation );
+                            xRet->NbcRotate( aObjData.aBoundRect.Center(), 
nObjectRotation );
                         // mirrored horizontally?
                         if ( nSpFlags & ShapeFlag::FlipH )
                         {
-                            tools::Rectangle aBndRect( pRet->GetSnapRect() );
+                            tools::Rectangle aBndRect(xRet->GetSnapRect());
                             Point aTop( ( aBndRect.Left() + aBndRect.Right() ) 
>> 1, aBndRect.Top() );
                             Point aBottom( aTop.X(), aTop.Y() + 1000 );
-                            pRet->NbcMirror( aTop, aBottom );
+                            xRet->NbcMirror( aTop, aBottom );
                         }
                         // mirrored vertically?
                         if ( nSpFlags & ShapeFlag::FlipV )
                         {
-                            tools::Rectangle aBndRect( pRet->GetSnapRect() );
+                            tools::Rectangle aBndRect(xRet->GetSnapRect());
                             Point aLeft( aBndRect.Left(), ( aBndRect.Top() + 
aBndRect.Bottom() ) >> 1 );
                             Point aRight( aLeft.X() + 1000, aLeft.Y() );
-                            pRet->NbcMirror( aLeft, aRight );
+                            xRet->NbcMirror( aLeft, aRight );
                         }
-                        basegfx::B2DPolyPolygon aPoly( 
static_cast<SdrObjCustomShape*>(pRet)->GetLineGeometry( true ) );
-                        SdrObject::Free( pRet );
+                        basegfx::B2DPolyPolygon aPoly( 
static_cast<SdrObjCustomShape*>(xRet.get())->GetLineGeometry( true ) );
 
-                        pRet = new SdrEdgeObj(*pSdrModel);
+                        xRet.reset(new SdrEdgeObj(*pSdrModel));
                         ApplyAttributes( rSt, aSet, aObjData );
-                        pRet->SetLogicRect( aObjData.aBoundRect );
-                        pRet->SetMergedItemSet(aSet);
+                        xRet->SetLogicRect( aObjData.aBoundRect );
+                        xRet->SetMergedItemSet(aSet);
 
                         // connectors
                         auto eConnectorStyle = 
GetPropertyValue(DFF_Prop_cxstyle, mso_cxstyleStraight);
 
-                        static_cast<SdrEdgeObj*>(pRet)->ConnectToNode(true, 
nullptr);
-                        static_cast<SdrEdgeObj*>(pRet)->ConnectToNode(false, 
nullptr);
+                        
static_cast<SdrEdgeObj*>(xRet.get())->ConnectToNode(true, nullptr);
+                        
static_cast<SdrEdgeObj*>(xRet.get())->ConnectToNode(false, nullptr);
 
                         Point aPoint1( aObjData.aBoundRect.TopLeft() );
                         Point aPoint2( aObjData.aBoundRect.BottomRight() );
@@ -4836,8 +4835,8 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                             nSpFlags &= ~ShapeFlag::FlipV;
                         }
 
-                        pRet->NbcSetPoint(aPoint1, 0); // start point
-                        pRet->NbcSetPoint(aPoint2, 1); // endpoint
+                        xRet->NbcSetPoint(aPoint1, 0); // start point
+                        xRet->NbcSetPoint(aPoint2, 1); // endpoint
 
                         sal_Int32 n1HorzDist, n1VertDist, n2HorzDist, 
n2VertDist;
                         n1HorzDist = n1VertDist = n2HorzDist = n2VertDist = 0;
@@ -4861,74 +4860,73 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                         aSet.Put( SdrEdgeNode2HorzDistItem( n2HorzDist ) );
                         aSet.Put( SdrEdgeNode2VertDistItem( n2VertDist ) );
 
-                        static_cast<SdrEdgeObj*>(pRet)->SetEdgeTrackPath( 
aPoly );
-                        pRet->SetMergedItemSet( aSet );
+                        
static_cast<SdrEdgeObj*>(xRet.get())->SetEdgeTrackPath( aPoly );
+                        xRet->SetMergedItemSet(aSet);
                     }
                     if ( aObjData.eShapeType == mso_sptLine )
                     {
-                        pRet->SetMergedItemSet(aSet);
-                        
static_cast<SdrObjCustomShape*>(pRet)->MergeDefaultAttributes();
+                        xRet->SetMergedItemSet(aSet);
+                        
static_cast<SdrObjCustomShape*>(xRet.get())->MergeDefaultAttributes();
                     }
                 }
             }
 
-            if ( pRet )
+            if (xRet)
             {
                 if( nObjectRotation )
-                    pRet->NbcRotate( aObjData.aBoundRect.Center(), 
nObjectRotation );
+                    xRet->NbcRotate( aObjData.aBoundRect.Center(), 
nObjectRotation );
                 // mirrored horizontally?
                 if ( nSpFlags & ShapeFlag::FlipH )
                 {
-                    tools::Rectangle aBndRect( pRet->GetSnapRect() );
+                    tools::Rectangle aBndRect(xRet->GetSnapRect());
                     Point aTop( ( aBndRect.Left() + aBndRect.Right() ) >> 1, 
aBndRect.Top() );
                     Point aBottom( aTop.X(), aTop.Y() + 1000 );
-                    pRet->NbcMirror( aTop, aBottom );
+                    xRet->NbcMirror(aTop, aBottom);
                 }
                 // mirrored vertically?
                 if ( nSpFlags & ShapeFlag::FlipV )
                 {
-                    tools::Rectangle aBndRect( pRet->GetSnapRect() );
+                    tools::Rectangle aBndRect(xRet->GetSnapRect());
                     Point aLeft( aBndRect.Left(), ( aBndRect.Top() + 
aBndRect.Bottom() ) >> 1 );
                     Point aRight( aLeft.X() + 1000, aLeft.Y() );
-                    pRet->NbcMirror( aLeft, aRight );
+                    xRet->NbcMirror(aLeft, aRight);
                 }
             }
         }
     }
 
     // #i51348# #118052# name of the shape
-    if( pRet )
+    if (xRet)
     {
         OUString aObjName = GetPropertyString( DFF_Prop_wzName, rSt );
         if( !aObjName.isEmpty() )
-            pRet->SetName( aObjName );
+            xRet->SetName(aObjName);
     }
 
-    pRet =
-        ProcessObj( rSt, aObjData, rClientData, aTextRect, pRet);
+    xRet.reset(ProcessObj(rSt, aObjData, rClientData, aTextRect, 
xRet.release()));
 
-    if ( pRet )
+    if (xRet)
     {
         sal_Int32 nGroupProperties( GetPropertyValue( DFF_Prop_fPrint, 0 ) );
         const bool bVisible = ( ( nGroupProperties & 2 ) == 0 );
-        pRet->SetVisible( bVisible );
+        xRet->SetVisible( bVisible );
         // In Excel hidden means not printed
         if ( !bVisible )
         {
-            pRet->SetPrintable( false );
+            xRet->SetPrintable(false);
         }
         else
         {
             // This property isn't used in Excel anymore, leaving it for 
legacy reasons
-            pRet->SetPrintable( ( nGroupProperties & 1 ) != 0 );
+            xRet->SetPrintable( ( nGroupProperties & 1 ) != 0 );
         }
     }
 
     //Import alt text as description
-    if ( pRet && SeekToContent( DFF_Prop_wzDescription, rSt ) )
+    if (xRet && SeekToContent(DFF_Prop_wzDescription, rSt))
     {
         OUString aAltText = MSDFFReadZString(rSt, 
GetPropertyValue(DFF_Prop_wzDescription, 0), true);
-        pRet->SetDescription( aAltText );
+        xRet->SetDescription(aAltText);
     }
 
     // If this shape opens a new group, push back its object data because
@@ -4941,9 +4939,9 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
     }
     else
     {
-        pRet = FinalizeObj(aObjData, pRet);
+        xRet.reset(FinalizeObj(aObjData, xRet.release()));
     }
-    return pRet;
+    return xRet.release();
 }
 
 tools::Rectangle SvxMSDffManager::GetGlobalChildAnchor( const DffRecordHeader& 
rHd, SvStream& rSt, tools::Rectangle& aClientRect )

Reply via email to