Kaydet (Commit) 02f0102b authored tarafından Markus Mohrhard's avatar Markus Mohrhard Kaydeden (comit) Michael Stahl

prevent memory leak

Found by Lsan.

Returning this or a heap allocated object asks for trouble. Let the
caller handle it and return null instead of this.

Change-Id: I7586e103bef5a8c2727adfe214b052d6962d4467
Reviewed-on: https://gerrit.libreoffice.org/10716Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
Tested-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 4189b715
...@@ -324,7 +324,10 @@ void GraphicPropertyItemConverter::FillSpecialItem( ...@@ -324,7 +324,10 @@ void GraphicPropertyItemConverter::FillSpecialItem(
// that the correct entry is chosen in the list of UI-names // that the correct entry is chosen in the list of UI-names
XLineDashItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel ); XLineDashItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel );
rOutItemSet.Put( *pItemToPut ); if(pItemToPut)
rOutItemSet.Put( *pItemToPut );
else
rOutItemSet.Put(aItem);
} }
break; break;
...@@ -347,7 +350,10 @@ void GraphicPropertyItemConverter::FillSpecialItem( ...@@ -347,7 +350,10 @@ void GraphicPropertyItemConverter::FillSpecialItem(
// that the correct entry is chosen in the list of UI-names // that the correct entry is chosen in the list of UI-names
XFillGradientItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel ); XFillGradientItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel );
rOutItemSet.Put( *pItemToPut ); if(pItemToPut)
rOutItemSet.Put( *pItemToPut );
else
rOutItemSet.Put(aItem);
} }
break; break;
...@@ -370,7 +376,10 @@ void GraphicPropertyItemConverter::FillSpecialItem( ...@@ -370,7 +376,10 @@ void GraphicPropertyItemConverter::FillSpecialItem(
// that the correct entry is chosen in the list of UI-names // that the correct entry is chosen in the list of UI-names
XFillHatchItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel ); XFillHatchItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel );
rOutItemSet.Put( *pItemToPut ); if(pItemToPut)
rOutItemSet.Put( *pItemToPut );
else
rOutItemSet.Put(aItem);
} }
break; break;
...@@ -388,7 +397,10 @@ void GraphicPropertyItemConverter::FillSpecialItem( ...@@ -388,7 +397,10 @@ void GraphicPropertyItemConverter::FillSpecialItem(
// that the correct entry is chosen in the list of UI-names // that the correct entry is chosen in the list of UI-names
XFillBitmapItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel ); XFillBitmapItem* pItemToPut = aItem.checkForUniqueItem( & m_rDrawModel );
rOutItemSet.Put( *pItemToPut ); if(pItemToPut)
rOutItemSet.Put( *pItemToPut );
else
rOutItemSet.Put(aItem);
} }
break; break;
......
...@@ -441,7 +441,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -441,7 +441,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLBITMAP ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLBITMAP );
SfxPoolItem* pNewItem = ((XFillBitmapItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XFillBitmapItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
...@@ -451,7 +451,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -451,7 +451,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEDASH ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEDASH );
SfxPoolItem* pNewItem = ((XLineDashItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XLineDashItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
...@@ -461,7 +461,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -461,7 +461,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINESTART ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINESTART );
SfxPoolItem* pNewItem = ((XLineStartItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XLineStartItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
...@@ -471,7 +471,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -471,7 +471,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEEND ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_LINEEND );
SfxPoolItem* pNewItem = ((XLineEndItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XLineEndItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
...@@ -481,7 +481,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -481,7 +481,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLGRADIENT ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLGRADIENT );
SfxPoolItem* pNewItem = ((XFillGradientItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XFillGradientItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
...@@ -491,7 +491,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -491,7 +491,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLFLOATTRANSPARENCE ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLFLOATTRANSPARENCE );
SfxPoolItem* pNewItem = ((XFillFloatTransparenceItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XFillFloatTransparenceItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
...@@ -501,7 +501,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq ) ...@@ -501,7 +501,7 @@ void FuTemplate::DoExecute( SfxRequest& rReq )
{ {
const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLHATCH ); const SfxPoolItem* pOldItem = rAttr.GetItem( XATTR_FILLHATCH );
SfxPoolItem* pNewItem = ((XFillHatchItem*)pOldItem)->checkForUniqueItem( mpDoc ); SfxPoolItem* pNewItem = ((XFillHatchItem*)pOldItem)->checkForUniqueItem( mpDoc );
if( pOldItem != pNewItem ) if( pNewItem )
{ {
rAttr.Put( *pNewItem ); rAttr.Put( *pNewItem );
delete pNewItem; delete pNewItem;
......
...@@ -165,62 +165,60 @@ namespace sdr ...@@ -165,62 +165,60 @@ namespace sdr
{ {
if(pNewItem) if(pNewItem)
{ {
const SfxPoolItem* pItem = pNewItem; const SfxPoolItem* pResultItem = NULL;
SdrModel* pModel = GetSdrObject().GetModel(); SdrModel* pModel = GetSdrObject().GetModel();
switch( nWhich ) switch( nWhich )
{ {
case XATTR_FILLBITMAP: case XATTR_FILLBITMAP:
{ {
pItem = ((XFillBitmapItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XFillBitmapItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
case XATTR_LINEDASH: case XATTR_LINEDASH:
{ {
pItem = ((XLineDashItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XLineDashItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
case XATTR_LINESTART: case XATTR_LINESTART:
{ {
pItem = ((XLineStartItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XLineStartItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
case XATTR_LINEEND: case XATTR_LINEEND:
{ {
pItem = ((XLineEndItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XLineEndItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
case XATTR_FILLGRADIENT: case XATTR_FILLGRADIENT:
{ {
pItem = ((XFillGradientItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XFillGradientItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
case XATTR_FILLFLOATTRANSPARENCE: case XATTR_FILLFLOATTRANSPARENCE:
{ {
// #85953# allow all kinds of XFillFloatTransparenceItem to be set // #85953# allow all kinds of XFillFloatTransparenceItem to be set
pItem = ((XFillFloatTransparenceItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XFillFloatTransparenceItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
case XATTR_FILLHATCH: case XATTR_FILLHATCH:
{ {
pItem = ((XFillHatchItem*)pItem)->checkForUniqueItem( pModel ); pResultItem = ((XFillHatchItem*)pNewItem)->checkForUniqueItem( pModel );
break; break;
} }
} }
// set item // set item
if(pItem) GetObjectItemSet();
if(pResultItem)
{ {
// force ItemSet // force ItemSet
GetObjectItemSet(); mpItemSet->Put(*pResultItem);
mpItemSet->Put(*pItem);
// delete item if it was a generated one // delete item if it was a generated one
if(pItem != pNewItem) delete (SfxPoolItem*)pResultItem;
{
delete (SfxPoolItem*)pItem;
}
} }
else
mpItemSet->Put(*pNewItem);
} }
else else
{ {
......
...@@ -1818,43 +1818,42 @@ void SdrModel::MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSe ...@@ -1818,43 +1818,42 @@ void SdrModel::MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSe
{ {
if(SFX_ITEM_SET == pSourceSet->GetItemState(nWhich, false, &pPoolItem)) if(SFX_ITEM_SET == pSourceSet->GetItemState(nWhich, false, &pPoolItem))
{ {
const SfxPoolItem* pItem = pPoolItem; const SfxPoolItem* pResultItem = NULL;
switch( nWhich ) switch( nWhich )
{ {
case XATTR_FILLBITMAP: case XATTR_FILLBITMAP:
pItem = ((XFillBitmapItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XFillBitmapItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
case XATTR_LINEDASH: case XATTR_LINEDASH:
pItem = ((XLineDashItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XLineDashItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
case XATTR_LINESTART: case XATTR_LINESTART:
pItem = ((XLineStartItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XLineStartItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
case XATTR_LINEEND: case XATTR_LINEEND:
pItem = ((XLineEndItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XLineEndItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
case XATTR_FILLGRADIENT: case XATTR_FILLGRADIENT:
pItem = ((XFillGradientItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XFillGradientItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
case XATTR_FILLFLOATTRANSPARENCE: case XATTR_FILLFLOATTRANSPARENCE:
// allow all kinds of XFillFloatTransparenceItem to be set // allow all kinds of XFillFloatTransparenceItem to be set
pItem = ((XFillFloatTransparenceItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XFillFloatTransparenceItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
case XATTR_FILLHATCH: case XATTR_FILLHATCH:
pItem = ((XFillHatchItem*)pItem)->checkForUniqueItem( pNewModel ); pResultItem = ((XFillHatchItem*)pPoolItem)->checkForUniqueItem( pNewModel );
break; break;
} }
// set item // set item
if( pItem ) if( pResultItem )
{ {
pDestSet->Put(*pItem); pDestSet->Put(*pResultItem);
delete (SfxPoolItem*)pResultItem;
// delete item if it was a generated one
if( pItem != pPoolItem)
delete (SfxPoolItem*)pItem;
} }
else
pDestSet->Put(*pPoolItem);
} }
nWhich = aWhichIter.NextWhich(); nWhich = aWhichIter.NextWhich();
} }
......
...@@ -1011,7 +1011,7 @@ XLineDashItem* XLineDashItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -1011,7 +1011,7 @@ XLineDashItem* XLineDashItem::checkForUniqueItem( SdrModel* pModel ) const
return new XLineDashItem( aUniqueName, aDash ); return new XLineDashItem( aUniqueName, aDash );
} }
return (XLineDashItem*)this; return NULL;
} }
// class XLineWidthItem // class XLineWidthItem
...@@ -1365,7 +1365,7 @@ XLineStartItem* XLineStartItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -1365,7 +1365,7 @@ XLineStartItem* XLineStartItem::checkForUniqueItem( SdrModel* pModel ) const
{ {
// if the polygon is empty, check if the name is empty // if the polygon is empty, check if the name is empty
if( aUniqueName.isEmpty() ) if( aUniqueName.isEmpty() )
return (XLineStartItem*)this; return NULL;
// force empty name for empty polygons // force empty name for empty polygons
return new XLineStartItem( "", maPolyPolygon ); return new XLineStartItem( "", maPolyPolygon );
...@@ -1567,7 +1567,7 @@ XLineStartItem* XLineStartItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -1567,7 +1567,7 @@ XLineStartItem* XLineStartItem::checkForUniqueItem( SdrModel* pModel ) const
} }
} }
return (XLineStartItem*)this; return NULL;
} }
// class XLineEndItem // class XLineEndItem
...@@ -1650,7 +1650,7 @@ XLineEndItem* XLineEndItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -1650,7 +1650,7 @@ XLineEndItem* XLineEndItem::checkForUniqueItem( SdrModel* pModel ) const
{ {
// if the polygon is empty, check if the name is empty // if the polygon is empty, check if the name is empty
if( aUniqueName.isEmpty() ) if( aUniqueName.isEmpty() )
return (XLineEndItem*)this; return NULL;
// force empty name for empty polygons // force empty name for empty polygons
return new XLineEndItem( "", maPolyPolygon ); return new XLineEndItem( "", maPolyPolygon );
...@@ -1852,7 +1852,7 @@ XLineEndItem* XLineEndItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -1852,7 +1852,7 @@ XLineEndItem* XLineEndItem::checkForUniqueItem( SdrModel* pModel ) const
} }
} }
return (XLineEndItem*)this; return NULL;
} }
bool XLineEndItem::GetPresentation bool XLineEndItem::GetPresentation
...@@ -2750,7 +2750,7 @@ XFillGradientItem* XFillGradientItem::checkForUniqueItem( SdrModel* pModel ) con ...@@ -2750,7 +2750,7 @@ XFillGradientItem* XFillGradientItem::checkForUniqueItem( SdrModel* pModel ) con
return new XFillGradientItem( aUniqueName, aGradient, Which() ); return new XFillGradientItem( aUniqueName, aGradient, Which() );
} }
return (XFillGradientItem*)this; return NULL;
} }
// class XFillFloatTransparenceItem - // class XFillFloatTransparenceItem -
...@@ -2858,7 +2858,7 @@ XFillFloatTransparenceItem* XFillFloatTransparenceItem::checkForUniqueItem( SdrM ...@@ -2858,7 +2858,7 @@ XFillFloatTransparenceItem* XFillFloatTransparenceItem::checkForUniqueItem( SdrM
} }
} }
return (XFillFloatTransparenceItem*)this; return NULL;
} }
// class XHatch // class XHatch
...@@ -3163,7 +3163,7 @@ XFillHatchItem* XFillHatchItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -3163,7 +3163,7 @@ XFillHatchItem* XFillHatchItem::checkForUniqueItem( SdrModel* pModel ) const
return new XFillHatchItem( aUniqueName, aHatch ); return new XFillHatchItem( aUniqueName, aHatch );
} }
return (XFillHatchItem*)this; return NULL;
} }
// --- form text attributes --- // --- form text attributes ---
......
...@@ -549,7 +549,7 @@ XFillBitmapItem* XFillBitmapItem::checkForUniqueItem( SdrModel* pModel ) const ...@@ -549,7 +549,7 @@ XFillBitmapItem* XFillBitmapItem::checkForUniqueItem( SdrModel* pModel ) const
} }
} }
return (XFillBitmapItem*)this; return NULL;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -453,7 +453,7 @@ void SwDoc::CheckForUniqueItemForLineFillNameOrIndex(SfxItemSet& rSet) ...@@ -453,7 +453,7 @@ void SwDoc::CheckForUniqueItemForLineFillNameOrIndex(SfxItemSet& rSet)
{ {
if (IsInvalidItem(pItem)) if (IsInvalidItem(pItem))
continue; continue;
const SfxPoolItem* pResult = pItem; const SfxPoolItem* pResult = NULL;
switch(pItem->Which()) switch(pItem->Which())
{ {
...@@ -494,7 +494,7 @@ void SwDoc::CheckForUniqueItemForLineFillNameOrIndex(SfxItemSet& rSet) ...@@ -494,7 +494,7 @@ void SwDoc::CheckForUniqueItemForLineFillNameOrIndex(SfxItemSet& rSet)
} }
} }
if(pResult != pItem) if(pResult)
{ {
rSet.Put(*pResult); rSet.Put(*pResult);
delete pResult; delete pResult;
......
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