Kaydet (Commit) d97b5e42 authored tarafından Takeshi Abe's avatar Takeshi Abe

Avoid possible memory leaks in case of exceptions

Change-Id: Icecc2cce52d7f27c030270639e6b85877e3aa620
üst 9a6cf486
...@@ -25,6 +25,8 @@ ...@@ -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 ) ...@@ -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 ) ...@@ -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 @@ ...@@ -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 ) ...@@ -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 ) ...@@ -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 ) ...@@ -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 ) ...@@ -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 ) ...@@ -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();
} }
} }
......
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