Kaydet (Commit) 9f0997eb authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: tdf#59222 Crash in Basic with an array of values...

from a range address

trying to make all SbxVariables reference count their parents
is ludiciously hard, so just reference count this one known
crashing case

Change-Id: Ie1fa6624e8184146dd00d766cdbacef674153ef6
Reviewed-on: https://gerrit.libreoffice.org/26272Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst be2cf3d2
......@@ -830,7 +830,7 @@ RTLFUNC(Array)
for( sal_uInt16 i = 0 ; i < nArraySize ; i++ )
{
SbxVariable* pVar = rPar.Get(i+1);
SbxVariable* pNew = new SbxVariable( *pVar );
SbxVariable* pNew = new SbxEnsureParentVariable(*pVar);
pNew->SetFlag( SbxFlagBits::Write );
short index = static_cast< short >(i);
if ( bIncIndex )
......
......@@ -100,6 +100,21 @@ SbxVariable::SbxVariable( const SbxVariable& r )
}
}
SbxEnsureParentVariable::SbxEnsureParentVariable(const SbxVariable& r)
: SbxVariable(r)
, xParent(const_cast<SbxVariable&>(r).GetParent())
{
assert(GetParent() == xParent.get());
}
void SbxEnsureParentVariable::SetParent(SbxObject* p)
{
assert(GetParent() == xParent.get());
SbxVariable::SetParent(p);
xParent = SbxObjectRef(p);
assert(GetParent() == xParent.get());
}
SbxVariable::SbxVariable( SbxDataType t, void* p ) : SbxValue( t, p )
{
pCst = nullptr;
......
......@@ -81,8 +81,6 @@ public:
void Dump( SvStream&, bool bDumpAll=false );
};
typedef tools::SvRef<SbxObject> SbxObjectRef;
#endif // INCLUDED_BASIC_SBXOBJ_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -283,8 +283,19 @@ public:
static sal_uInt16 MakeHashCode( const OUString& rName );
};
typedef tools::SvRef<SbxObject> SbxObjectRef;
typedef tools::SvRef<SbxVariable> SbxVariableRef;
//tdf#59222 SbxEnsureParentVariable is a SbxVariable which keeps a reference to
//its parent, ensuring it always exists while this SbxVariable exists
class BASIC_DLLPUBLIC SbxEnsureParentVariable : public SbxVariable
{
SbxObjectRef xParent;
public:
SbxEnsureParentVariable(const SbxVariable& r);
virtual void SetParent(SbxObject* p) override;
};
#endif // INCLUDED_BASIC_SBXVAR_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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