lotuswordpro/inc/xfilter/xftable.hxx             |    2 +
 lotuswordpro/qa/cppunit/data/fail/ofz35646-1.lwp |binary
 lotuswordpro/source/filter/xfilter/xfcell.cxx    |    2 -
 lotuswordpro/source/filter/xfilter/xftable.cxx   |   32 ++++++++++++++++++++++-
 4 files changed, 34 insertions(+), 2 deletions(-)

New commits:
commit b67f42c4c2906b7059b93d748c8efccd588b1e1c
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Aug 25 17:42:17 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Aug 26 09:56:08 2021 +0200

    ofz#35646 Indirect-leak
    
    Change-Id: Ie79d9c49b6beef04ab111a63166abc7f093ad36b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121041
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/lotuswordpro/inc/xfilter/xftable.hxx 
b/lotuswordpro/inc/xfilter/xftable.hxx
index f36a1f295be6..ce292f3a258c 100644
--- a/lotuswordpro/inc/xfilter/xftable.hxx
+++ b/lotuswordpro/inc/xfilter/xftable.hxx
@@ -115,6 +115,8 @@ private:
     OUString   m_strDefCellStyle;
     OUString   m_strDefRowStyle;
     OUString   m_strDefColStyle;
+
+    bool ContainsTable(const XFTable* pTable) const;
 };
 
 inline void XFTable::SetTableName(const OUString& name)
diff --git a/lotuswordpro/qa/cppunit/data/fail/ofz35646-1.lwp 
b/lotuswordpro/qa/cppunit/data/fail/ofz35646-1.lwp
new file mode 100644
index 000000000000..5db8cea8c5bd
Binary files /dev/null and b/lotuswordpro/qa/cppunit/data/fail/ofz35646-1.lwp 
differ
diff --git a/lotuswordpro/source/filter/xfilter/xfcell.cxx 
b/lotuswordpro/source/filter/xfilter/xfcell.cxx
index bbfde6eab9f3..dfc5889db652 100644
--- a/lotuswordpro/source/filter/xfilter/xfcell.cxx
+++ b/lotuswordpro/source/filter/xfilter/xfcell.cxx
@@ -157,7 +157,7 @@ OUString   XFCell::GetCellName()
     return name;
 }
 
-void    XFCell::ToXml(IXFStream *pStrm)
+void XFCell::ToXml(IXFStream *pStrm)
 {
     IXFAttrList *pAttrList = pStrm->GetAttrList();
 
diff --git a/lotuswordpro/source/filter/xfilter/xftable.cxx 
b/lotuswordpro/source/filter/xfilter/xftable.cxx
index 6acb1b21a35f..4326f218b1e2 100644
--- a/lotuswordpro/source/filter/xfilter/xftable.cxx
+++ b/lotuswordpro/source/filter/xfilter/xftable.cxx
@@ -81,6 +81,30 @@ void    XFTable::SetColumnStyle(sal_Int32 col, const 
OUString& style)
     m_aColumns[col] = style;
 }
 
+bool XFTable::ContainsTable(const XFTable* pTable) const
+{
+    for (auto const& elem : m_aRows)
+    {
+        const XFRow *pRow = elem.second.get();
+
+        for (sal_Int32 i = 0; i < pRow->GetCellCount(); ++i)
+        {
+            const XFCell* pCell = pRow->GetCell(i + 1); //starts at 1, not 0
+            if (const XFTable* pSubTable = pCell->GetSubTable())
+            {
+                if (pSubTable == pTable)
+                    return true;
+                if (pTable->ContainsTable(pTable))
+                    return true;
+            }
+            if (pCell->HierarchyContains(pTable))
+                return true;
+        }
+    }
+
+    return false;
+}
+
 void XFTable::AddRow(rtl::Reference<XFRow> const & rRow)
 {
     assert(rRow);
@@ -88,8 +112,14 @@ 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 || 
pFirstCell->HierarchyContains(this))
+        if (const XFTable* pSubTable = pFirstCell->GetSubTable())
+        {
+            if (pSubTable == this || pSubTable->ContainsTable(this))
+                throw std::runtime_error("table is a subtable of itself");
+        }
+        if (pFirstCell->HierarchyContains(this))
             throw std::runtime_error("table is a subtable of itself");
+
     }
 
     int row = rRow->GetRow();

Reply via email to