summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-12-10 10:00:58 +0000
committerMichael Stahl <mstahl@redhat.com>2015-12-14 16:19:02 +0000
commitea854163776df3b93ac3ab281babff8f05553bc5 (patch)
tree12867e47cfec42c809ac94a08158b35c1512fe35
parentd7169f73f9415652689a7dfa41cf83642545a76e (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>
-rw-r--r--lotuswordpro/source/filter/lwpdoc.cxx8
-rw-r--r--lotuswordpro/source/filter/lwpframelayout.cxx2
-rw-r--r--lotuswordpro/source/filter/lwpobj.cxx3
-rw-r--r--lotuswordpro/source/filter/lwpobj.hxx14
-rw-r--r--lotuswordpro/source/filter/lwppagelayout.cxx2
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
}
}