diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-07-27 08:58:56 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2018-08-10 10:56:58 +0200 |
commit | 8b23e372cdecb642e6bed937e0dbe1fa8d2d030b (patch) | |
tree | 12b282a32ca00cf55705a67532efae8c4f332352 /lotuswordpro | |
parent | 23325908c592bf8db74ad44f1f456e5ff5c794c8 (diff) |
ofz#9603 infinite recursion
Change-Id: Ia4d0e3c1bb12330bd2f754e663055e1218da926f
Reviewed-on: https://gerrit.libreoffice.org/58179
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
(cherry picked from commit 089b7c342b5e64f45bf279d37b7261cca5c25d32)
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 9c27ae7e8dab..29ba8482f375 100644 --- a/lotuswordpro/source/filter/lwplayout.cxx +++ b/lotuswordpro/source/filter/lwplayout.cxx @@ -592,6 +592,7 @@ void LwpLayoutMisc::Read(LwpObjectStream* pStrm) LwpMiddleLayout::LwpMiddleLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ) : LwpVirtualLayout(objHdr, pStrm) , m_bGettingGeometry(false) + , m_bGettingBackgroundStuff(false) { } @@ -659,21 +660,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; } /** @@ -822,21 +830,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 518da035ea14..97610408c05a 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(); @@ -405,7 +397,6 @@ protected: virtual bool IsAutoGrowDown() override; private: LwpObjectID m_BasedOnStyle; - LwpLayoutGeometry* Geometry(); protected: enum { @@ -425,6 +416,7 @@ protected: LwpObjectID m_LayBackgroundStuff; LwpObjectID m_LayExtBorderStuff; bool m_bGettingGeometry; + bool m_bGettingBackgroundStuff; public: LwpObjectID& GetContent() { return m_Content; } LwpTabOverride* GetTabOverride(); |