diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-12-10 10:00:58 +0000 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2015-12-14 16:19:02 +0000 |
commit | ea854163776df3b93ac3ab281babff8f05553bc5 (patch) | |
tree | 12867e47cfec42c809ac94a08158b35c1512fe35 /lotuswordpro/source/filter | |
parent | d7169f73f9415652689a7dfa41cf83642545a76e (diff) |
guard against infinite recursion on parsing objects
Change-Id: Ia6502afde54dbf379bc9951c80c6594f1f436ef5
(cherry picked from commit fbd329800340a496def839181858964b1e3709a5)
Reviewed-on: https://gerrit.libreoffice.org/20579
Reviewed-by: David Tardon <dtardon@redhat.com>
Tested-by: David Tardon <dtardon@redhat.com>
(cherry picked from commit 564687e728c98fec5ba6ffa39007793b2b4aa4e8)
Reviewed-on: https://gerrit.libreoffice.org/20697
Reviewed-by: Michael Stahl <mstahl@redhat.com>
Tested-by: Michael Stahl <mstahl@redhat.com>
Diffstat (limited to 'lotuswordpro/source/filter')
-rw-r--r-- | lotuswordpro/source/filter/lwpdoc.cxx | 8 | ||||
-rw-r--r-- | lotuswordpro/source/filter/lwpframelayout.cxx | 2 | ||||
-rw-r--r-- | lotuswordpro/source/filter/lwpobj.cxx | 3 | ||||
-rw-r--r-- | lotuswordpro/source/filter/lwpobj.hxx | 14 | ||||
-rw-r--r-- | lotuswordpro/source/filter/lwppagelayout.cxx | 2 |
5 files changed, 21 insertions, 8 deletions
diff --git a/lotuswordpro/source/filter/lwpdoc.cxx b/lotuswordpro/source/filter/lwpdoc.cxx index c93b668af608..a0dc5303d035 100644 --- a/lotuswordpro/source/filter/lwpdoc.cxx +++ b/lotuswordpro/source/filter/lwpdoc.cxx @@ -166,7 +166,7 @@ void LwpDocument::Parse(IXFStream* pOutputStream) rtl::Reference<LwpObject> pDocSock = GetSocket().obj( VO_DOCSOCK ); if(pDocSock.is()) { - pDocSock->Parse(pOutputStream); + pDocSock->DoParse(pOutputStream); } } @@ -412,7 +412,7 @@ void LwpDocument::ParseDocContent(IXFStream* pOutputStream) return; } pLayoutObj->SetFoundry(m_pFoundry); - pLayoutObj->Parse(pOutputStream); + pLayoutObj->DoParse(pOutputStream); } /** @@ -795,11 +795,11 @@ void LwpDocSock::Parse(IXFStream* pOutputStream) { rtl::Reference<LwpObject> pDoc = GetChildHead().obj(); if(pDoc.is()) - pDoc->Parse(pOutputStream); + pDoc->DoParse(pOutputStream); pDoc = GetNext().obj(); if(pDoc.is()) - pDoc->Parse(pOutputStream); + pDoc->DoParse(pOutputStream); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lotuswordpro/source/filter/lwpframelayout.cxx b/lotuswordpro/source/filter/lwpframelayout.cxx index 47a561439faa..feff262b133d 100644 --- a/lotuswordpro/source/filter/lwpframelayout.cxx +++ b/lotuswordpro/source/filter/lwpframelayout.cxx @@ -1155,7 +1155,7 @@ void LwpDropcapLayout::Parse(IXFStream* pOutputStream) if(pPara.is()) { pPara->SetFoundry(m_pFoundry); - pPara->Parse(pOutputStream); + pPara->DoParse(pOutputStream); } } diff --git a/lotuswordpro/source/filter/lwpobj.cxx b/lotuswordpro/source/filter/lwpobj.cxx index 010b60ebe253..be9a07f37c8e 100644 --- a/lotuswordpro/source/filter/lwpobj.cxx +++ b/lotuswordpro/source/filter/lwpobj.cxx @@ -64,7 +64,8 @@ * @descr construct lwpobject from stream */ LwpObject::LwpObject(LwpObjectHeader objHdr, LwpSvStream* pStrm) - : m_ObjHdr(objHdr), m_pObjStrm(nullptr), m_pFoundry(nullptr), m_pStrm(pStrm), m_bRegisteringStyle(false) + : m_ObjHdr(objHdr), m_pObjStrm(nullptr), m_pFoundry(nullptr) + , m_pStrm(pStrm), m_bRegisteringStyle(false), m_bParsingStyle(false) { m_pObjStrm = new LwpObjectStream(pStrm, m_ObjHdr.IsCompressed(), static_cast<sal_uInt16>(m_ObjHdr.GetSize()) ); diff --git a/lotuswordpro/source/filter/lwpobj.hxx b/lotuswordpro/source/filter/lwpobj.hxx index 23ed6b288803..978bc494a1b5 100644 --- a/lotuswordpro/source/filter/lwpobj.hxx +++ b/lotuswordpro/source/filter/lwpobj.hxx @@ -95,9 +95,11 @@ protected: LwpFoundry* m_pFoundry; LwpSvStream* m_pStrm; bool m_bRegisteringStyle; + bool m_bParsingStyle; protected: virtual void Read(); virtual void RegisterStyle(); + virtual void Parse(IXFStream* pOutputStream); public: void QuickRead(); //calls RegisterStyle but bails if DoRegisterStyle is called @@ -110,7 +112,17 @@ public: RegisterStyle(); m_bRegisteringStyle = false; } - virtual void Parse(IXFStream* pOutputStream); + //calls Parse but bails if DoParse is called + //on the same object recursively + void DoParse(IXFStream* pOutputStream) + { + if (m_bParsingStyle) + throw std::runtime_error("recursion in parsing"); + m_bParsingStyle = true; + Parse(pOutputStream); + m_bParsingStyle = false; + } + virtual void XFConvert(XFContentContainer* pCont); LwpFoundry* GetFoundry(){return m_pFoundry;} diff --git a/lotuswordpro/source/filter/lwppagelayout.cxx b/lotuswordpro/source/filter/lwppagelayout.cxx index 56048634845c..0f788992b303 100644 --- a/lotuswordpro/source/filter/lwppagelayout.cxx +++ b/lotuswordpro/source/filter/lwppagelayout.cxx @@ -127,7 +127,7 @@ void LwpPageLayout::Parse(IXFStream* pOutputStream) if(pStory.is()) { pStory->SetFoundry(m_pFoundry); - pStory->Parse(pOutputStream); //Do not parse the next story + pStory->DoParse(pOutputStream); //Do not parse the next story } } |