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

guard against infinite recursion on parsing objects

Change-Id: Ia6502afde54dbf379bc9951c80c6594f1f436ef5
üst b8d86c97
...@@ -166,7 +166,7 @@ void LwpDocument::Parse(IXFStream* pOutputStream) ...@@ -166,7 +166,7 @@ void LwpDocument::Parse(IXFStream* pOutputStream)
rtl::Reference<LwpObject> pDocSock = GetSocket().obj( VO_DOCSOCK ); rtl::Reference<LwpObject> pDocSock = GetSocket().obj( VO_DOCSOCK );
if(pDocSock.is()) if(pDocSock.is())
{ {
pDocSock->Parse(pOutputStream); pDocSock->DoParse(pOutputStream);
} }
} }
...@@ -412,7 +412,7 @@ void LwpDocument::ParseDocContent(IXFStream* pOutputStream) ...@@ -412,7 +412,7 @@ void LwpDocument::ParseDocContent(IXFStream* pOutputStream)
return; return;
} }
pLayoutObj->SetFoundry(m_pFoundry); pLayoutObj->SetFoundry(m_pFoundry);
pLayoutObj->Parse(pOutputStream); pLayoutObj->DoParse(pOutputStream);
} }
/** /**
...@@ -795,11 +795,11 @@ void LwpDocSock::Parse(IXFStream* pOutputStream) ...@@ -795,11 +795,11 @@ void LwpDocSock::Parse(IXFStream* pOutputStream)
{ {
rtl::Reference<LwpObject> pDoc = GetChildHead().obj(); rtl::Reference<LwpObject> pDoc = GetChildHead().obj();
if(pDoc.is()) if(pDoc.is())
pDoc->Parse(pOutputStream); pDoc->DoParse(pOutputStream);
pDoc = GetNext().obj(); pDoc = GetNext().obj();
if(pDoc.is()) if(pDoc.is())
pDoc->Parse(pOutputStream); pDoc->DoParse(pOutputStream);
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -1148,7 +1148,7 @@ void LwpDropcapLayout::Parse(IXFStream* pOutputStream) ...@@ -1148,7 +1148,7 @@ void LwpDropcapLayout::Parse(IXFStream* pOutputStream)
if(pPara.is()) if(pPara.is())
{ {
pPara->SetFoundry(m_pFoundry); pPara->SetFoundry(m_pFoundry);
pPara->Parse(pOutputStream); pPara->DoParse(pOutputStream);
} }
} }
......
...@@ -60,7 +60,8 @@ ...@@ -60,7 +60,8 @@
* @descr construct lwpobject from stream * @descr construct lwpobject from stream
*/ */
LwpObject::LwpObject(LwpObjectHeader objHdr, LwpSvStream* pStrm) 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(), m_pObjStrm = new LwpObjectStream(pStrm, m_ObjHdr.IsCompressed(),
static_cast<sal_uInt16>(m_ObjHdr.GetSize()) ); static_cast<sal_uInt16>(m_ObjHdr.GetSize()) );
......
...@@ -91,9 +91,11 @@ protected: ...@@ -91,9 +91,11 @@ protected:
LwpFoundry* m_pFoundry; LwpFoundry* m_pFoundry;
LwpSvStream* m_pStrm; LwpSvStream* m_pStrm;
bool m_bRegisteringStyle; bool m_bRegisteringStyle;
bool m_bParsingStyle;
protected: protected:
virtual void Read(); virtual void Read();
virtual void RegisterStyle(); virtual void RegisterStyle();
virtual void Parse(IXFStream* pOutputStream);
public: public:
void QuickRead(); void QuickRead();
//calls RegisterStyle but bails if DoRegisterStyle is called //calls RegisterStyle but bails if DoRegisterStyle is called
...@@ -106,7 +108,17 @@ public: ...@@ -106,7 +108,17 @@ public:
RegisterStyle(); RegisterStyle();
m_bRegisteringStyle = false; 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); virtual void XFConvert(XFContentContainer* pCont);
LwpFoundry* GetFoundry(){return m_pFoundry;} LwpFoundry* GetFoundry(){return m_pFoundry;}
......
...@@ -124,7 +124,7 @@ void LwpPageLayout::Parse(IXFStream* pOutputStream) ...@@ -124,7 +124,7 @@ void LwpPageLayout::Parse(IXFStream* pOutputStream)
if(pStory.is()) if(pStory.is())
{ {
pStory->SetFoundry(m_pFoundry); pStory->SetFoundry(m_pFoundry);
pStory->Parse(pOutputStream); //Do not parse the next story pStory->DoParse(pOutputStream); //Do not parse the next story
} }
} }
......
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