Kaydet (Commit) 17838c9c authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: tdf#114427 crash when basic used to dispose shape

Change-Id: Ia078a0f4262fbe18b6cf463dbff33df1d4fd0a95
Reviewed-on: https://gerrit.libreoffice.org/59036
Tested-by: Jenkins
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst d064ced9
...@@ -1357,39 +1357,43 @@ void SAL_CALL SvxShape::dispose() ...@@ -1357,39 +1357,43 @@ void SAL_CALL SvxShape::dispose()
mpImpl->maDisposeListeners.disposeAndClear(aEvt); mpImpl->maDisposeListeners.disposeAndClear(aEvt);
mpImpl->maPropertyNotifier.disposing(); mpImpl->maPropertyNotifier.disposing();
bool bFreeSdrObject = false;
if ( HasSdrObject() ) if ( HasSdrObject() )
{ {
EndListening( GetSdrObject()->getSdrModelFromSdrObject() ); SdrObject* pObject = GetSdrObject();
bool bFreeSdrObject = false; EndListening( pObject->getSdrModelFromSdrObject() );
if ( pObject->IsInserted() && pObject->getSdrPageFromSdrObject() )
if ( GetSdrObject()->IsInserted() && GetSdrObject()->getSdrPageFromSdrObject() )
{ {
OSL_ENSURE( HasSdrObjectOwnership(), "SvxShape::dispose: is the below code correct?" ); OSL_ENSURE( HasSdrObjectOwnership(), "SvxShape::dispose: is the below code correct?" );
// normally, we are allowed to free the SdrObject only if we have its ownership. // normally, we are allowed to free the SdrObject only if we have its ownership.
// Why isn't this checked here? // Why isn't this checked here?
SdrPage* pPage = GetSdrObject()->getSdrPageFromSdrObject(); SdrPage* pPage = pObject->getSdrPageFromSdrObject();
// delete the SdrObject from the page // delete the SdrObject from the page
const size_t nCount = pPage->GetObjCount(); const size_t nCount = pPage->GetObjCount();
for ( size_t nNum = 0; nNum < nCount; ++nNum ) for ( size_t nNum = 0; nNum < nCount; ++nNum )
{ {
if ( pPage->GetObj( nNum ) == GetSdrObject() ) if ( pPage->GetObj( nNum ) == pObject )
{ {
OSL_VERIFY( pPage->RemoveObject( nNum ) == GetSdrObject() ); OSL_VERIFY( pPage->RemoveObject( nNum ) == pObject );
bFreeSdrObject = true; bFreeSdrObject = true;
break; break;
} }
} }
} }
}
GetSdrObject()->setUnoShape(nullptr); if ( HasSdrObject() ) //tdf#114427 refetch SdrObject in light of RemoveObject
{
SdrObject* pObject = GetSdrObject();
pObject->setUnoShape(nullptr);
if ( bFreeSdrObject ) if ( bFreeSdrObject )
{ {
// in case we have the ownership of the SdrObject, a Free // in case we have the ownership of the SdrObject, a Free
// would do nothing. So ensure the ownership is reset. // would do nothing. So ensure the ownership is reset.
mpImpl->mbHasSdrObjectOwnership = false; mpImpl->mbHasSdrObjectOwnership = false;
SdrObject* pObject = GetSdrObject();
SdrObject::Free( pObject ); SdrObject::Free( pObject );
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment