From c00af602013b840f4f92c15b259ce6cdeeaabcae Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Mon, 22 May 2017 09:10:14 +0100 Subject: Resolves: tdf#107959 SdrGrafObj leak triggers later crash if the graphic doesn't change, then the cloned SdrGrafObj persists beyond stylesheet destruction and blows up Change-Id: I0013e7e118985c1334ab460507bc5c8271700160 (cherry picked from commit 118401aae4516bf4cc122e96b376d129ab3a3d5e) (cherry picked from commit e4db2fc10ba4447fa5393853d0cfed795b260f0b) Reviewed-on: https://gerrit.libreoffice.org/39261 Tested-by: Jenkins Reviewed-by: Michael Stahl --- sd/source/ui/view/drviews6.cxx | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/sd/source/ui/view/drviews6.cxx b/sd/source/ui/view/drviews6.cxx index 1e137982404e..ec445e75fe37 100644 --- a/sd/source/ui/view/drviews6.cxx +++ b/sd/source/ui/view/drviews6.cxx @@ -276,20 +276,17 @@ void DrawViewShell::ExecBmpMask( SfxRequest& rReq ) if ( pObj && !mpDrawView->IsTextEdit() ) { - SdrGrafObj* pNewObj = pObj->Clone(); + std::unique_ptr xNewObj(pObj->Clone()); bool bCont = true; - if( pNewObj->IsLinkedGraphic() ) + if (xNewObj->IsLinkedGraphic()) { ScopedVclPtrInstance< MessageDialog > aQueryBox( static_cast(GetActiveWindow()),"QueryUnlinkImageDialog","modules/sdraw/ui/queryunlinkimagedialog.ui"); if (RET_YES == aQueryBox->Execute()) - pNewObj->ReleaseGraphicLink(); + xNewObj->ReleaseGraphicLink(); else - { - delete pNewObj; bCont = false; - } } SfxChildWindow* pWnd = GetViewFrame()->GetChildWindow( @@ -298,21 +295,21 @@ void DrawViewShell::ExecBmpMask( SfxRequest& rReq ) assert(pBmpMask); if (bCont && pBmpMask) { - const Graphic& rOldGraphic = pNewObj->GetGraphic(); + const Graphic& rOldGraphic = xNewObj->GetGraphic(); const Graphic aNewGraphic(pBmpMask->Mask(rOldGraphic)); if( aNewGraphic != rOldGraphic ) { SdrPageView* pPV = mpDrawView->GetSdrPageView(); - pNewObj->SetEmptyPresObj( false ); - pNewObj->SetGraphic(pBmpMask->Mask(pNewObj->GetGraphic())); + xNewObj->SetEmptyPresObj(false); + xNewObj->SetGraphic(pBmpMask->Mask(xNewObj->GetGraphic())); OUString aStr( mpDrawView->GetDescriptionOfMarkedObjects() ); aStr += " " + SD_RESSTR(STR_EYEDROPPER); mpDrawView->BegUndo( aStr ); - mpDrawView->ReplaceObjectAtView( pObj, *pPV, pNewObj ); + mpDrawView->ReplaceObjectAtView(pObj, *pPV, xNewObj.release()); mpDrawView->EndUndo(); } } -- cgit v1.2.3