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

ofz#9603 infinite recursion

Change-Id: Ia4d0e3c1bb12330bd2f754e663055e1218da926f
Reviewed-on: https://gerrit.libreoffice.org/58177
Tested-by: Jenkins
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst aca1bcb5
...@@ -588,6 +588,7 @@ void LwpLayoutMisc::Read(LwpObjectStream* pStrm) ...@@ -588,6 +588,7 @@ void LwpLayoutMisc::Read(LwpObjectStream* pStrm)
LwpMiddleLayout::LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ) LwpMiddleLayout::LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm )
: LwpVirtualLayout(objHdr, pStrm) : LwpVirtualLayout(objHdr, pStrm)
, m_bGettingGeometry(false) , m_bGettingGeometry(false)
, m_bGettingBackgroundStuff(false)
{ {
} }
...@@ -655,21 +656,28 @@ rtl::Reference<LwpObject> LwpMiddleLayout::GetBasedOnStyle() ...@@ -655,21 +656,28 @@ rtl::Reference<LwpObject> LwpMiddleLayout::GetBasedOnStyle()
* @descr: Get the geometry of current layout * @descr: Get the geometry of current layout
* *
*/ */
LwpLayoutGeometry* LwpMiddleLayout::Geometry() LwpLayoutGeometry* LwpMiddleLayout::GetGeometry()
{ {
if (m_bGettingGeometry)
throw std::runtime_error("recursion in layout");
m_bGettingGeometry = true;
LwpLayoutGeometry* pRet = nullptr;
if( !m_LayGeometry.IsNull() ) if( !m_LayGeometry.IsNull() )
{ {
return dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj().get()); pRet = dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj().get());
} }
else else
{ {
rtl::Reference<LwpObject> xBase(GetBasedOnStyle()); rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get())) if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get()))
{ {
return pLay->GetGeometry(); pRet = pLay->GetGeometry();
} }
} }
return nullptr;
m_bGettingGeometry = false;
return pRet;
} }
/** /**
...@@ -818,21 +826,30 @@ LwpBorderStuff* LwpMiddleLayout::GetBorderStuff() ...@@ -818,21 +826,30 @@ LwpBorderStuff* LwpMiddleLayout::GetBorderStuff()
*/ */
LwpBackgroundStuff* LwpMiddleLayout::GetBackgroundStuff() LwpBackgroundStuff* LwpMiddleLayout::GetBackgroundStuff()
{ {
if (m_bGettingBackgroundStuff)
throw std::runtime_error("recursion in layout");
m_bGettingBackgroundStuff = true;
LwpBackgroundStuff* pRet = nullptr;
if(m_nOverrideFlag & OVER_BACKGROUND) if(m_nOverrideFlag & OVER_BACKGROUND)
{ {
LwpLayoutBackground* pLayoutBackground = dynamic_cast<LwpLayoutBackground*>(m_LayBackgroundStuff.obj().get()); LwpLayoutBackground* pLayoutBackground = dynamic_cast<LwpLayoutBackground*>(m_LayBackgroundStuff.obj().get());
return pLayoutBackground ? &pLayoutBackground->GetBackgoudStuff() : nullptr; pRet = pLayoutBackground ? &pLayoutBackground->GetBackgoudStuff() : nullptr;
} }
else else
{ {
rtl::Reference<LwpObject> xBase(GetBasedOnStyle()); rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get())) if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get()))
{ {
return pLay->GetBackgroundStuff(); pRet = pLay->GetBackgroundStuff();
} }
} }
return nullptr;
m_bGettingBackgroundStuff = false;
return pRet;
} }
/** /**
* @descr: create xfborder. * @descr: create xfborder.
*/ */
......
...@@ -347,19 +347,11 @@ class LwpMiddleLayout : public LwpVirtualLayout ...@@ -347,19 +347,11 @@ class LwpMiddleLayout : public LwpVirtualLayout
public: public:
LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ); LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm );
virtual ~LwpMiddleLayout() override; virtual ~LwpMiddleLayout() override;
LwpLayoutGeometry* GetGeometry()
{
if (m_bGettingGeometry)
throw std::runtime_error("recursion in layout");
m_bGettingGeometry = true;
auto pRet = Geometry();
m_bGettingGeometry = false;
return pRet;
}
double GetGeometryHeight(); double GetGeometryHeight();
double GetGeometryWidth(); double GetGeometryWidth();
LwpBorderStuff* GetBorderStuff(); LwpBorderStuff* GetBorderStuff();
LwpBackgroundStuff* GetBackgroundStuff(); LwpBackgroundStuff* GetBackgroundStuff();
LwpLayoutGeometry* GetGeometry();
enumXFTextDir GetTextDirection(); enumXFTextDir GetTextDirection();
XFBorders* GetXFBorders(); XFBorders* GetXFBorders();
LwpColor* GetBackColor(); LwpColor* GetBackColor();
...@@ -402,7 +394,6 @@ protected: ...@@ -402,7 +394,6 @@ protected:
virtual bool IsAutoGrowDown() override; virtual bool IsAutoGrowDown() override;
private: private:
LwpObjectID m_BasedOnStyle; LwpObjectID m_BasedOnStyle;
LwpLayoutGeometry* Geometry();
protected: protected:
enum enum
{ {
...@@ -422,6 +413,7 @@ protected: ...@@ -422,6 +413,7 @@ protected:
LwpObjectID m_LayBackgroundStuff; LwpObjectID m_LayBackgroundStuff;
LwpObjectID m_LayExtBorderStuff; LwpObjectID m_LayExtBorderStuff;
bool m_bGettingGeometry; bool m_bGettingGeometry;
bool m_bGettingBackgroundStuff;
public: public:
LwpObjectID& GetContent() { return m_Content; } LwpObjectID& GetContent() { return m_Content; }
LwpTabOverride* GetTabOverride(); LwpTabOverride* GetTabOverride();
......
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