Avoid possible memory leaks in case of exceptions
Change-Id: Icecc2cce52d7f27c030270639e6b85877e3aa620
This commit is contained in:
@@ -25,6 +25,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "image.hxx"
|
#include "image.hxx"
|
||||||
#include <codegen.hxx>
|
#include <codegen.hxx>
|
||||||
|
#include <boost/scoped_array.hpp>
|
||||||
|
|
||||||
SbiImage::SbiImage()
|
SbiImage::SbiImage()
|
||||||
{
|
{
|
||||||
pStringOff = NULL;
|
pStringOff = NULL;
|
||||||
@@ -206,15 +208,14 @@ bool SbiImage::Load( SvStream& r, sal_uInt32& nVersion )
|
|||||||
pStrings = new sal_Unicode[ nLen ];
|
pStrings = new sal_Unicode[ nLen ];
|
||||||
nStringSize = (sal_uInt16) nLen;
|
nStringSize = (sal_uInt16) nLen;
|
||||||
|
|
||||||
char* pByteStrings = new char[ nLen ];
|
boost::scoped_array<char> pByteStrings(new char[ nLen ]);
|
||||||
r.Read( pByteStrings, nStringSize );
|
r.Read( pByteStrings.get(), nStringSize );
|
||||||
for( short j = 0; j < nStrings; j++ )
|
for( short j = 0; j < nStrings; j++ )
|
||||||
{
|
{
|
||||||
sal_uInt16 nOff2 = (sal_uInt16) pStringOff[ j ];
|
sal_uInt16 nOff2 = (sal_uInt16) pStringOff[ j ];
|
||||||
OUString aStr( pByteStrings + nOff2, strlen(pByteStrings + nOff2), eCharSet );
|
OUString aStr( pByteStrings.get() + nOff2, strlen(pByteStrings.get() + nOff2), eCharSet );
|
||||||
memcpy( pStrings + nOff2, aStr.getStr(), (aStr.getLength() + 1) * sizeof( sal_Unicode ) );
|
memcpy( pStrings + nOff2, aStr.getStr(), (aStr.getLength() + 1) * sizeof( sal_Unicode ) );
|
||||||
}
|
}
|
||||||
delete[] pByteStrings;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case B_MODEND:
|
case B_MODEND:
|
||||||
@@ -324,17 +325,17 @@ bool SbiImage::Save( SvStream& r, sal_uInt32 nVer )
|
|||||||
r.WriteUInt32( (sal_uInt32) pStringOff[ i ] );
|
r.WriteUInt32( (sal_uInt32) pStringOff[ i ] );
|
||||||
}
|
}
|
||||||
// Then the String-Block
|
// Then the String-Block
|
||||||
char* pByteStrings = new char[ nStringSize ];
|
boost::scoped_array<char> pByteStrings(new char[ nStringSize ]);
|
||||||
for( i = 0; i < nStrings; i++ )
|
for( i = 0; i < nStrings; i++ )
|
||||||
{
|
{
|
||||||
sal_uInt16 nOff = (sal_uInt16) pStringOff[ i ];
|
sal_uInt16 nOff = (sal_uInt16) pStringOff[ i ];
|
||||||
OString aStr(OUStringToOString(OUString(pStrings + nOff), eCharSet));
|
OString aStr(OUStringToOString(OUString(pStrings + nOff), eCharSet));
|
||||||
memcpy( pByteStrings + nOff, aStr.getStr(), (aStr.getLength() + 1) * sizeof( char ) );
|
memcpy( pByteStrings.get() + nOff, aStr.getStr(), (aStr.getLength() + 1) * sizeof( char ) );
|
||||||
}
|
}
|
||||||
r.WriteUInt32( (sal_uInt32) nStringSize );
|
r.WriteUInt32( (sal_uInt32) nStringSize );
|
||||||
r.Write( pByteStrings, nStringSize );
|
r.Write( pByteStrings.get(), nStringSize );
|
||||||
|
|
||||||
delete[] pByteStrings;
|
pByteStrings.reset();
|
||||||
SbiCloseRecord( r, nPos );
|
SbiCloseRecord( r, nPos );
|
||||||
}
|
}
|
||||||
// Set overall length
|
// Set overall length
|
||||||
|
@@ -46,6 +46,7 @@
|
|||||||
#include <com/sun/star/util/XCloseBroadcaster.hpp>
|
#include <com/sun/star/util/XCloseBroadcaster.hpp>
|
||||||
#include <com/sun/star/util/XCloseListener.hpp>
|
#include <com/sun/star/util/XCloseListener.hpp>
|
||||||
#include "errobject.hxx"
|
#include "errobject.hxx"
|
||||||
|
#include <boost/scoped_array.hpp>
|
||||||
#include <boost/unordered_map.hpp>
|
#include <boost/unordered_map.hpp>
|
||||||
|
|
||||||
#include <com/sun/star/script/ModuleType.hpp>
|
#include <com/sun/star/script/ModuleType.hpp>
|
||||||
@@ -1872,7 +1873,7 @@ bool StarBASIC::LoadData( SvStream& r, sal_uInt16 nVer )
|
|||||||
// #95459 Delete dialogs, otherwise endless recursion
|
// #95459 Delete dialogs, otherwise endless recursion
|
||||||
// in SbxVarable::GetType() if dialogs are accessed
|
// in SbxVarable::GetType() if dialogs are accessed
|
||||||
sal_uInt16 nObjCount = pObjs->Count();
|
sal_uInt16 nObjCount = pObjs->Count();
|
||||||
SbxVariable** ppDeleteTab = new SbxVariable*[ nObjCount ];
|
boost::scoped_array<SbxVariable*> ppDeleteTab(new SbxVariable*[ nObjCount ]);
|
||||||
sal_uInt16 nObj;
|
sal_uInt16 nObj;
|
||||||
|
|
||||||
for( nObj = 0 ; nObj < nObjCount ; nObj++ )
|
for( nObj = 0 ; nObj < nObjCount ; nObj++ )
|
||||||
@@ -1889,7 +1890,7 @@ bool StarBASIC::LoadData( SvStream& r, sal_uInt16 nVer )
|
|||||||
pObjs->Remove( pVar );
|
pObjs->Remove( pVar );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete[] ppDeleteTab;
|
ppDeleteTab.reset();
|
||||||
|
|
||||||
sal_uInt16 nMod;
|
sal_uInt16 nMod;
|
||||||
pModules->Clear();
|
pModules->Clear();
|
||||||
|
@@ -588,7 +588,7 @@ void SbiParser::DefType( bool bPrivate )
|
|||||||
|
|
||||||
SbxObject *pType = new SbxObject(aSym);
|
SbxObject *pType = new SbxObject(aSym);
|
||||||
|
|
||||||
SbiSymDef* pElem;
|
boost::scoped_ptr<SbiSymDef> pElem;
|
||||||
SbiDimList* pDim = NULL;
|
SbiDimList* pDim = NULL;
|
||||||
bool bDone = false;
|
bool bDone = false;
|
||||||
|
|
||||||
@@ -597,19 +597,17 @@ void SbiParser::DefType( bool bPrivate )
|
|||||||
switch( Peek() )
|
switch( Peek() )
|
||||||
{
|
{
|
||||||
case ENDTYPE :
|
case ENDTYPE :
|
||||||
pElem = NULL;
|
|
||||||
bDone = true;
|
bDone = true;
|
||||||
Next();
|
Next();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EOLN :
|
case EOLN :
|
||||||
case REM :
|
case REM :
|
||||||
pElem = NULL;
|
|
||||||
Next();
|
Next();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
pElem = VarDecl(&pDim, false, false);
|
pElem.reset(VarDecl(&pDim, false, false));
|
||||||
if( !pElem )
|
if( !pElem )
|
||||||
bDone = true; // Error occurred
|
bDone = true; // Error occurred
|
||||||
}
|
}
|
||||||
@@ -678,7 +676,7 @@ void SbiParser::DefType( bool bPrivate )
|
|||||||
pTypeMembers->Insert( pTypeElem, pTypeMembers->Count() );
|
pTypeMembers->Insert( pTypeElem, pTypeMembers->Count() );
|
||||||
}
|
}
|
||||||
delete pDim, pDim = NULL;
|
delete pDim, pDim = NULL;
|
||||||
delete pElem;
|
pElem.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user