diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-07-27 08:58:56 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-07-27 17:15:10 +0200 |
commit | d97dd0d7e9075f5cdb5f3b6a62256d0fdca6d425 (patch) | |
tree | 6a013bb826ac23ed4a455d7b80f13f71e36f7fe8 /lotuswordpro | |
parent | aca1bcb5a28c35de1b893388ec6327a66ce97ef7 (diff) |
ofz#9603 infinite recursion
Change-Id: Ia4d0e3c1bb12330bd2f754e663055e1218da926f
Reviewed-on: https://gerrit.libreoffice.org/58177
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'lotuswordpro')
-rw-r--r-- | lotuswordpro/source/filter/lwplayout.cxx | 31 | ||||
-rw-r--r-- | lotuswordpro/source/filter/lwplayout.hxx | 12 |
2 files changed, 26 insertions, 17 deletions
diff --git a/lotuswordpro/source/filter/lwplayout.cxx b/lotuswordpro/source/filter/lwplayout.cxx index 487058cbb08b..5e548d1a6019 100644 --- a/lotuswordpro/source/filter/lwplayout.cxx +++ b/lotuswordpro/source/filter/lwplayout.cxx @@ -588,6 +588,7 @@ void LwpLayoutMisc::Read(LwpObjectStream* pStrm) LwpMiddleLayout::LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ) : LwpVirtualLayout(objHdr, pStrm) , m_bGettingGeometry(false) + , m_bGettingBackgroundStuff(false) { } @@ -655,21 +656,28 @@ rtl::Reference<LwpObject> LwpMiddleLayout::GetBasedOnStyle() * @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() ) { - return dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj().get()); + pRet = dynamic_cast<LwpLayoutGeometry*> (m_LayGeometry.obj().get()); } else { rtl::Reference<LwpObject> xBase(GetBasedOnStyle()); 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() */ LwpBackgroundStuff* LwpMiddleLayout::GetBackgroundStuff() { + if (m_bGettingBackgroundStuff) + throw std::runtime_error("recursion in layout"); + m_bGettingBackgroundStuff = true; + + LwpBackgroundStuff* pRet = nullptr; + if(m_nOverrideFlag & OVER_BACKGROUND) { LwpLayoutBackground* pLayoutBackground = dynamic_cast<LwpLayoutBackground*>(m_LayBackgroundStuff.obj().get()); - return pLayoutBackground ? &pLayoutBackground->GetBackgoudStuff() : nullptr; + pRet = pLayoutBackground ? &pLayoutBackground->GetBackgoudStuff() : nullptr; } else { rtl::Reference<LwpObject> xBase(GetBasedOnStyle()); if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get())) { - return pLay->GetBackgroundStuff(); + pRet = pLay->GetBackgroundStuff(); } } - return nullptr; + + m_bGettingBackgroundStuff = false; + return pRet; } + /** * @descr: create xfborder. */ diff --git a/lotuswordpro/source/filter/lwplayout.hxx b/lotuswordpro/source/filter/lwplayout.hxx index 2d0694b67864..98d7ca515906 100644 --- a/lotuswordpro/source/filter/lwplayout.hxx +++ b/lotuswordpro/source/filter/lwplayout.hxx @@ -347,19 +347,11 @@ class LwpMiddleLayout : public LwpVirtualLayout public: LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ); 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 GetGeometryWidth(); LwpBorderStuff* GetBorderStuff(); LwpBackgroundStuff* GetBackgroundStuff(); + LwpLayoutGeometry* GetGeometry(); enumXFTextDir GetTextDirection(); XFBorders* GetXFBorders(); LwpColor* GetBackColor(); @@ -402,7 +394,6 @@ protected: virtual bool IsAutoGrowDown() override; private: LwpObjectID m_BasedOnStyle; - LwpLayoutGeometry* Geometry(); protected: enum { @@ -422,6 +413,7 @@ protected: LwpObjectID m_LayBackgroundStuff; LwpObjectID m_LayExtBorderStuff; bool m_bGettingGeometry; + bool m_bGettingBackgroundStuff; public: LwpObjectID& GetContent() { return m_Content; } LwpTabOverride* GetTabOverride(); |