summaryrefslogtreecommitdiff
path: root/lotuswordpro
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-07-29 13:51:14 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-07-29 16:15:34 +0200
commitb1dc1c740e37639bb309f4aa6a1c2567f99083fc (patch)
tree139e06a99c67423160c46a1643027a43d87fea76 /lotuswordpro
parentb18a2228add4ba94415628f85c8ccc9f331e4916 (diff)
ofz#24404 row insert attempt in table with same table already in the row
Change-Id: I0f52de029600b182e479af3bdf56da7ea2c2ef01 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99691 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'lotuswordpro')
-rw-r--r--lotuswordpro/inc/xfilter/xfcontentcontainer.hxx2
-rw-r--r--lotuswordpro/source/filter/xfilter/xfcontentcontainer.cxx18
-rw-r--r--lotuswordpro/source/filter/xfilter/xftable.cxx2
3 files changed, 21 insertions, 1 deletions
diff --git a/lotuswordpro/inc/xfilter/xfcontentcontainer.hxx b/lotuswordpro/inc/xfilter/xfcontentcontainer.hxx
index f3a843f1481f..e8ad3347ebab 100644
--- a/lotuswordpro/inc/xfilter/xfcontentcontainer.hxx
+++ b/lotuswordpro/inc/xfilter/xfcontentcontainer.hxx
@@ -125,6 +125,8 @@ public:
*/
virtual void ToXml(IXFStream *pStrm) override;
+ bool HierarchyContains(const XFContent *pContent) const;
+
private:
std::vector< rtl::Reference<XFContent> > m_aContents;
};
diff --git a/lotuswordpro/source/filter/xfilter/xfcontentcontainer.cxx b/lotuswordpro/source/filter/xfilter/xfcontentcontainer.cxx
index b64ad72721a4..14aaea9515df 100644
--- a/lotuswordpro/source/filter/xfilter/xfcontentcontainer.cxx
+++ b/lotuswordpro/source/filter/xfilter/xfcontentcontainer.cxx
@@ -80,6 +80,24 @@ void XFContentContainer::Add(const OUString& text)
Add(xTC.get());
}
+bool XFContentContainer::HierarchyContains(const XFContent *pContent) const
+{
+ if (pContent == this)
+ return true;
+
+ for (int i = 0, nCount = GetCount(); i < nCount; i++)
+ {
+ rtl::Reference<XFContent> xContent = GetContent(i);
+ if (xContent.get() == pContent)
+ return true;
+ const XFContentContainer *pChildCont = dynamic_cast<const XFContentContainer*>(xContent.get());
+ if (pChildCont && pChildCont->HierarchyContains(pContent))
+ return true;
+ }
+
+ return false;
+}
+
int XFContentContainer::GetCount() const
{
return m_aContents.size();
diff --git a/lotuswordpro/source/filter/xfilter/xftable.cxx b/lotuswordpro/source/filter/xfilter/xftable.cxx
index 07da1a57d4fc..6acb1b21a35f 100644
--- a/lotuswordpro/source/filter/xfilter/xftable.cxx
+++ b/lotuswordpro/source/filter/xfilter/xftable.cxx
@@ -88,7 +88,7 @@ void XFTable::AddRow(rtl::Reference<XFRow> const & rRow)
for (sal_Int32 i = 0; i < rRow->GetCellCount(); ++i)
{
XFCell* pFirstCell = rRow->GetCell(i + 1); //starts at 1, not 0
- if (pFirstCell->GetSubTable() == this)
+ if (pFirstCell->GetSubTable() == this || pFirstCell->HierarchyContains(this))
throw std::runtime_error("table is a subtable of itself");
}