diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-05-22 09:10:14 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2017-06-30 18:16:56 +0200 |
commit | c00af602013b840f4f92c15b259ce6cdeeaabcae (patch) | |
tree | fd3e02a0309ded0d6fd8a4f8634afbfab6dac8a7 | |
parent | 5eec9409f10d1a08c826edb689eefb86240b7b25 (diff) |
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 <ci@libreoffice.org>
Reviewed-by: Michael Stahl <mstahl@redhat.com>
-rw-r--r-- | sd/source/ui/view/drviews6.cxx | 17 |
1 files 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<SdrGrafObj> xNewObj(pObj->Clone()); bool bCont = true; - if( pNewObj->IsLinkedGraphic() ) + if (xNewObj->IsLinkedGraphic()) { ScopedVclPtrInstance< MessageDialog > aQueryBox( static_cast<vcl::Window*>(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(); } } |