Kaydet (Commit) 6e403346 authored tarafından Laurent Godard's avatar Laurent Godard Kaydeden (comit) Caolán McNamara

null pointer guard if no user defined types declared at the module level

Change-Id: I368a168c636e4029e9cd9bbe4a4df5d9b846c923
Reviewed-on: https://gerrit.libreoffice.org/17834Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst b28a2cb6
......@@ -443,79 +443,82 @@ bool SbiImage::Save( SvStream& r, sal_uInt32 nVer )
SbiCloseRecord( r, nPos );
}
// User defined types
sal_uInt16 nTypes = rTypes->Count();
if (nTypes > 0 )
if (rTypes)
{
nPos = SbiOpenRecord( r, B_SBXOBJECTS, nTypes );
for (sal_uInt16 i = 0; i < nTypes; i++)
sal_uInt16 nTypes = rTypes->Count();
if (nTypes > 0 )
{
SbxObject* pType = static_cast< SbxObject* > ( rTypes->Get(i) );
OUString aTypeName = pType->GetClassName();
nPos = SbiOpenRecord( r, B_SBXOBJECTS, nTypes );
r.WriteUniOrByteString( aTypeName, eCharSet );
for (sal_uInt16 i = 0; i < nTypes; i++)
{
SbxObject* pType = static_cast< SbxObject* > ( rTypes->Get(i) );
OUString aTypeName = pType->GetClassName();
SbxArray *pTypeMembers = pType->GetProperties();
sal_uInt16 nTypeMembers = pTypeMembers->Count();
r.WriteUniOrByteString( aTypeName, eCharSet );
r.WriteInt16(nTypeMembers);
SbxArray *pTypeMembers = pType->GetProperties();
sal_uInt16 nTypeMembers = pTypeMembers->Count();
for (sal_uInt16 j = 0; j < nTypeMembers; j++)
{
r.WriteInt16(nTypeMembers);
SbxProperty* pTypeElem = static_cast< SbxProperty* > ( pTypeMembers->Get(j) );
for (sal_uInt16 j = 0; j < nTypeMembers; j++)
{
OUString aElemName = pTypeElem->GetName();
r.WriteUniOrByteString( aElemName, eCharSet );
SbxProperty* pTypeElem = static_cast< SbxProperty* > ( pTypeMembers->Get(j) );
SbxDataType dataType = pTypeElem->GetType();
r.WriteInt16(dataType);
OUString aElemName = pTypeElem->GetName();
r.WriteUniOrByteString( aElemName, eCharSet );
SbxFlagBits nElemFlags = pTypeElem->GetFlags();
r.WriteUInt32(static_cast< sal_uInt32 > (nElemFlags) );
SbxDataType dataType = pTypeElem->GetType();
r.WriteInt16(dataType);
SbxBase* pElemObject = pTypeElem->GetObject();
SbxFlagBits nElemFlags = pTypeElem->GetFlags();
r.WriteUInt32(static_cast< sal_uInt32 > (nElemFlags) );
if (pElemObject)
{
r.WriteInt16(1); // has elem Object
SbxBase* pElemObject = pTypeElem->GetObject();
if( dataType == SbxOBJECT )
if (pElemObject)
{
// nested user defined types
// declared before use, so it is ok to reference it by name on load
SbxObject* pNestedType = static_cast< SbxObject* > ( pElemObject );
r.WriteUniOrByteString( pNestedType->GetClassName(), eCharSet );
}
else
{
// an array
SbxDimArray* pArray = static_cast< SbxDimArray* > ( pElemObject );
r.WriteInt16(1); // has elem Object
bool bFixedSize = pArray->hasFixedSize();
if (bFixedSize)
r.WriteInt16(1);
if( dataType == SbxOBJECT )
{
// nested user defined types
// declared before use, so it is ok to reference it by name on load
SbxObject* pNestedType = static_cast< SbxObject* > ( pElemObject );
r.WriteUniOrByteString( pNestedType->GetClassName(), eCharSet );
}
else
r.WriteInt16(0);
{
// an array
SbxDimArray* pArray = static_cast< SbxDimArray* > ( pElemObject );
sal_Int32 nDims = pArray->GetDims();
r.WriteInt32(nDims);
bool bFixedSize = pArray->hasFixedSize();
if (bFixedSize)
r.WriteInt16(1);
else
r.WriteInt16(0);
for (sal_Int32 d = 0; d < nDims; d++)
{
sal_Int32 lBound;
sal_Int32 uBound;
pArray->GetDim32(d, lBound, uBound);
r.WriteInt32(lBound).WriteInt32(uBound);
sal_Int32 nDims = pArray->GetDims();
r.WriteInt32(nDims);
for (sal_Int32 d = 0; d < nDims; d++)
{
sal_Int32 lBound;
sal_Int32 uBound;
pArray->GetDim32(d, lBound, uBound);
r.WriteInt32(lBound).WriteInt32(uBound);
}
}
}
}
else
r.WriteInt16(0); // no elem Object
else
r.WriteInt16(0); // no elem Object
}
}
SbiCloseRecord( r, nPos );
}
SbiCloseRecord( r, nPos );
}
// Set overall length
SbiCloseRecord( r, nStart );
......
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