summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-02-08 10:01:06 +0000
committerMichael Stahl <Michael.Stahl@cib.de>2018-05-10 16:02:52 +0200
commit14c9ddc755f600a2ecbf0f2e715b5ff3ff3a234b (patch)
tree947c253f5d469c0c755af69c5c0691cae699aef8
parent4fd9ba592c2a9a566813942b06c864ad37e96243 (diff)
ofz#6104 guard against self recursive GetShadow
Change-Id: If1cf0ef365f78665cc5b9f5f1ea53e82b531f9b0 (cherry picked from commit f9826620aae0f9f9fb1dd30216e6be317ecb103b) ofz#6448 infinite-regress Change-Id: Ie0c082a4b43355e935594f2dda694edfc9cdf315 Reviewed-on: https://gerrit.libreoffice.org/49950 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit 68cebacac864da199ace7fe03db0e054e6b36966) ofz#6602 infinite recursion Change-Id: I358708f606655bcd0df948fd2e01725c706880c7 (cherry picked from commit e07a1a5d6957dbb4dc19cb4d274406e8e075c729) ofz#6640 avoid recurse to death Change-Id: Ia798636a5b4013753a268fff68915ec56c384e5f (cherry picked from commit ad56a550864cbe86687abbea492af47b5ab5d7c6) ofz#7146 Infinite recurse Change-Id: I0afc3a73933e3370c5b1aeca1beabec94c56a6e6 Reviewed-on: https://gerrit.libreoffice.org/51911 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit 78a43ceeca45f42d674bbf8b5c95a108ebc6590c) ofz#8161 avoid recurse to death Change-Id: If3fc212ed0fe2b3cb3c1381198d46387861ac3dd Reviewed-on: https://gerrit.libreoffice.org/53974 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
-rw-r--r--lotuswordpro/source/filter/lwplayout.cxx120
-rw-r--r--lotuswordpro/source/filter/lwplayout.hxx7
2 files changed, 92 insertions, 35 deletions
diff --git a/lotuswordpro/source/filter/lwplayout.cxx b/lotuswordpro/source/filter/lwplayout.cxx
index 7a1dddda5954..9c27ae7e8dab 100644
--- a/lotuswordpro/source/filter/lwplayout.cxx
+++ b/lotuswordpro/source/filter/lwplayout.cxx
@@ -83,6 +83,10 @@ LwpVirtualLayout::LwpVirtualLayout(LwpObjectHeader const &objHdr, LwpSvStream* p
, m_bGettingMarginsValue(false)
, m_bGettingExtMarginsValue(false)
, m_bGettingUsePrinterSettings(false)
+ , m_bGettingScaleCenter(false)
+ , m_bGettingBorderStuff(false)
+ , m_bGettingUseWhen(false)
+ , m_bGettingStyleLayout(false)
, m_nAttributes(0)
, m_nAttributes2(0)
, m_nAttributes3(0)
@@ -228,6 +232,12 @@ bool LwpVirtualLayout::IsComplex()
*/
LwpUseWhen* LwpVirtualLayout::GetUseWhen()
{
+ if (m_bGettingUseWhen)
+ throw std::runtime_error("recursion in layout");
+ m_bGettingUseWhen= true;
+
+ LwpUseWhen* pRet = nullptr;
+
/*
If we have a parent, and I'm not a page layout,
use my parents information.
@@ -237,11 +247,16 @@ LwpUseWhen* LwpVirtualLayout::GetUseWhen()
//get parent
rtl::Reference<LwpVirtualLayout> xParent(dynamic_cast<LwpVirtualLayout*>(GetParent().obj().get()));
if (xParent.is() && !xParent->IsHeader() && (xParent->GetLayoutType() != LWP_PAGE_LAYOUT))
- return xParent->GetUseWhen();
+ pRet = xParent->GetUseWhen();
}
- return VirtualGetUseWhen();
+ if (!pRet)
+ pRet = VirtualGetUseWhen();
+
+ m_bGettingUseWhen = false;
+
+ return pRet;
}
/**
* @descr: Whether this layout is page layout or not
@@ -353,13 +368,22 @@ bool LwpVirtualLayout::NoContentReference()
bool LwpVirtualLayout::IsStyleLayout()
{
+ if (m_bGettingStyleLayout)
+ throw std::runtime_error("recursion in layout");
+ m_bGettingStyleLayout = true;
+
+ bool bRet = false;
if (m_nAttributes3 & STYLE3_STYLELAYOUT)
- return true;
+ bRet = true;
+ else
+ {
+ rtl::Reference<LwpVirtualLayout> xParent(dynamic_cast<LwpVirtualLayout*>(GetParent().obj().get()));
+ if (xParent.is())
+ bRet = xParent->IsStyleLayout();
+ }
- rtl::Reference<LwpVirtualLayout> xParent(dynamic_cast<LwpVirtualLayout*>(GetParent().obj().get()));
- if (xParent.is())
- return xParent->IsStyleLayout();
- return false;
+ m_bGettingStyleLayout = false;
+ return bRet;
}
/**
@@ -769,20 +793,28 @@ double LwpMiddleLayout::ExtMarginsValue(sal_uInt8 nWhichSide)
*/
LwpBorderStuff* LwpMiddleLayout::GetBorderStuff()
{
+ if (m_bGettingBorderStuff)
+ throw std::runtime_error("recursion in layout");
+ m_bGettingBorderStuff = true;
+
+ LwpBorderStuff* pRet = nullptr;
+
if(m_nOverrideFlag & OVER_BORDERS)
{
LwpLayoutBorder* pLayoutBorder = dynamic_cast<LwpLayoutBorder*>(m_LayBorderStuff.obj().get());
- return pLayoutBorder ? &pLayoutBorder->GetBorderStuff() : nullptr;
+ pRet = pLayoutBorder ? &pLayoutBorder->GetBorderStuff() : nullptr;
}
else
{
rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
if (LwpMiddleLayout* pLay = dynamic_cast<LwpMiddleLayout*>(xBase.get()))
{
- return pLay->GetBorderStuff();
+ pRet = pLay->GetBorderStuff();
}
}
- return nullptr;
+
+ m_bGettingBorderStuff= false;
+ return pRet;
}
/**
@@ -935,16 +967,26 @@ sal_uInt16 LwpMiddleLayout::GetScaleTile()
sal_uInt16 LwpMiddleLayout::GetScaleCenter()
{
+ if (m_bGettingScaleCenter)
+ throw std::runtime_error("recursion in layout");
+ m_bGettingScaleCenter = true;
+
+ sal_uInt16 nRet = 0;
+
if ((m_nOverrideFlag & OVER_SCALING) && m_LayScale.obj().is() && GetLayoutScale())
{
- return (GetLayoutScale()->GetPlacement() & LwpLayoutScale::CENTERED)
+ nRet = (GetLayoutScale()->GetPlacement() & LwpLayoutScale::CENTERED)
? 1 : 0;
}
- rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
- if (xBase.is())
- return dynamic_cast<LwpMiddleLayout&>(*xBase.get()).GetScaleCenter();
else
- return 0;
+ {
+ rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
+ if (xBase.is())
+ nRet = dynamic_cast<LwpMiddleLayout&>(*xBase.get()).GetScaleCenter();
+ }
+
+ m_bGettingScaleCenter = false;
+ return nRet;
}
sal_uInt32 LwpMiddleLayout::GetScalePercentage()
@@ -1469,9 +1511,12 @@ bool LwpMiddleLayout::HasContent()
return content.is();
}
-LwpLayout::LwpLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm ) :
- LwpMiddleLayout(objHdr, pStrm)
-{}
+LwpLayout::LwpLayout(LwpObjectHeader const &objHdr, LwpSvStream* pStrm)
+ : LwpMiddleLayout(objHdr, pStrm)
+ , m_bGettingShadow(false)
+ , m_bGettingNumCols(false)
+{
+}
LwpLayout::~LwpLayout()
{
@@ -1518,24 +1563,24 @@ void LwpLayout::Read()
*/
sal_uInt16 LwpLayout::GetNumCols()
{
- if(m_nOverrideFlag & OVER_COLUMNS)
+ if (m_bGettingNumCols)
+ throw std::runtime_error("recursion in layout");
+ m_bGettingNumCols = true;
+
+ sal_uInt16 nRet = 0;
+ LwpLayoutColumns* pLayColumns = (m_nOverrideFlag & OVER_COLUMNS) ? dynamic_cast<LwpLayoutColumns*>(m_LayColumns.obj().get()) : nullptr;
+ if (pLayColumns)
{
- LwpLayoutColumns* pLayColumns = dynamic_cast<LwpLayoutColumns*>(m_LayColumns.obj().get());
- if(pLayColumns)
- {
- return pLayColumns->GetNumCols();
- }
+ nRet = pLayColumns->GetNumCols();
}
-
- rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
- LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*>(xBase.get());
- if (pStyle)
+ else
{
- return pStyle->GetNumCols();
+ rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
+ LwpVirtualLayout* pStyle = dynamic_cast<LwpVirtualLayout*>(xBase.get());
+ nRet = pStyle ? pStyle->GetNumCols() : LwpVirtualLayout::GetNumCols();
}
-
- return LwpVirtualLayout::GetNumCols();
-
+ m_bGettingNumCols = false;
+ return nRet;
}
/**
@@ -1860,20 +1905,25 @@ bool LwpLayout::IsUseOnPage()
*/
LwpShadow* LwpLayout::GetShadow()
{
+ if (m_bGettingShadow)
+ throw std::runtime_error("recursion in layout");
+ m_bGettingShadow = true;
+ LwpShadow* pRet = nullptr;
if(m_nOverrideFlag & OVER_SHADOW)
{
LwpLayoutShadow* pLayoutShadow = dynamic_cast<LwpLayoutShadow*>(m_LayShadow.obj().get());
- return pLayoutShadow ? &pLayoutShadow->GetShadow() : nullptr;
+ pRet = pLayoutShadow ? &pLayoutShadow->GetShadow() : nullptr;
}
else
{
rtl::Reference<LwpObject> xBase(GetBasedOnStyle());
if (LwpLayout* pLay = dynamic_cast<LwpLayout*>(xBase.get()))
{
- return pLay->GetShadow();
+ pRet = pLay->GetShadow();
}
}
- return nullptr;
+ m_bGettingShadow = false;
+ return pRet;
}
/**
diff --git a/lotuswordpro/source/filter/lwplayout.hxx b/lotuswordpro/source/filter/lwplayout.hxx
index 560822c858c6..518da035ea14 100644
--- a/lotuswordpro/source/filter/lwplayout.hxx
+++ b/lotuswordpro/source/filter/lwplayout.hxx
@@ -237,6 +237,10 @@ protected:
bool m_bGettingMarginsValue;
bool m_bGettingExtMarginsValue;
bool m_bGettingUsePrinterSettings;
+ bool m_bGettingScaleCenter;
+ bool m_bGettingBorderStuff;
+ bool m_bGettingUseWhen;
+ bool m_bGettingStyleLayout;
sal_uInt32 m_nAttributes;
sal_uInt32 m_nAttributes2;
sal_uInt32 m_nAttributes3;
@@ -428,6 +432,9 @@ public:
class LwpLayout : public LwpMiddleLayout
{
+private:
+ bool m_bGettingShadow;
+ bool m_bGettingNumCols;
public:
LwpLayout( LwpObjectHeader const &objHdr, LwpSvStream* pStrm );
virtual ~LwpLayout() override;