include/xmloff/xmlnumfi.hxx      |    6 ++++--
 xmloff/source/style/xmlnumfi.cxx |   29 +++++++++++++++++++++--------
 2 files changed, 25 insertions(+), 10 deletions(-)

New commits:
commit 4857535b81afc2191c73a1cbddde003fe169c8f9
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Mon Jun 23 09:24:58 2025 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Jun 26 18:01:50 2025 +0200

    ofz#426843907 Stack-overflow
    
    Change-Id: I03f10968aaa32960bc6dfd2175a582ec1dd30918
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186815
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    (cherry picked from commit b6d240c4bab906f84c0ecefc2b4021b59ff368e4)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186935
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/include/xmloff/xmlnumfi.hxx b/include/xmloff/xmlnumfi.hxx
index c8de09bfd106..c6a3159d796e 100644
--- a/include/xmloff/xmlnumfi.hxx
+++ b/include/xmloff/xmlnumfi.hxx
@@ -158,7 +158,10 @@ private:
     SvXMLDateElementAttributes  m_eDateSecs;
     bool                        m_bDateNoDefault;
 
-    SAL_DLLPRIVATE sal_Int32 PrivateGetKey();
+    SAL_DLLPRIVATE sal_Int32 
PrivateGetKey(std::vector<SvXMLNumFormatContext*>& rCreateStack);
+
+    SAL_DLLPRIVATE sal_Int32 CreateAndInsert(SvNumberFormatter* pFormatter, 
std::vector<SvXMLNumFormatContext*>& rCreateStack);
+    SAL_DLLPRIVATE void CreateAndInsert(bool bOverwrite, 
std::vector<SvXMLNumFormatContext*>& rCreateStack);
 
 public:
                 SvXMLNumFormatContext( SvXMLImport& rImport,
@@ -180,7 +183,6 @@ public:
     virtual void CreateAndInsert(bool bOverwrite) override final;
 
     sal_Int32 GetKey();
-    sal_Int32 CreateAndInsert( SvNumberFormatter* pFormatter );
     sal_Int32 CreateAndInsert( css::uno::Reference< 
css::util::XNumberFormatsSupplier > const & xFormatsSupplier );
     SvXMLStylesTokens GetType() const           { return m_nType; }   // 
SvXMLStylesTokens
 
diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx
index 2a51c7c66701..8803bf63f6de 100644
--- a/xmloff/source/style/xmlnumfi.cxx
+++ b/xmloff/source/style/xmlnumfi.cxx
@@ -1523,7 +1523,7 @@ sal_Int32 SvXMLNumFormatContext::GetKey()
     }
 }
 
-sal_Int32 SvXMLNumFormatContext::PrivateGetKey()
+sal_Int32 
SvXMLNumFormatContext::PrivateGetKey(std::vector<SvXMLNumFormatContext*>& 
rCreateStack)
 {
     //  used for map elements in CreateAndInsert - don't reset bRemoveAfterUse 
flag
 
@@ -1531,7 +1531,7 @@ sal_Int32 SvXMLNumFormatContext::PrivateGetKey()
         return m_nKey;
     else
     {
-        CreateAndInsert(true);
+        CreateAndInsert(true, rCreateStack);
         return m_nKey;
     }
 }
@@ -1547,7 +1547,10 @@ sal_Int32 SvXMLNumFormatContext::CreateAndInsert( 
css::uno::Reference< css::util
             pFormatter = pObj->GetNumberFormatter();
 
         if ( pFormatter )
-            return CreateAndInsert( pFormatter );
+        {
+            std::vector<SvXMLNumFormatContext*> aCreateStack;
+            return CreateAndInsert(pFormatter, aCreateStack);
+        }
         else
             return -1;
     }
@@ -1555,13 +1558,19 @@ sal_Int32 SvXMLNumFormatContext::CreateAndInsert( 
css::uno::Reference< css::util
         return m_nKey;
 }
 
-void SvXMLNumFormatContext::CreateAndInsert(bool /*bOverwrite*/)
+void SvXMLNumFormatContext::CreateAndInsert(bool bOverwrite)
+{
+    std::vector<SvXMLNumFormatContext*> aCreateStack;
+    return CreateAndInsert(bOverwrite, aCreateStack);
+}
+
+void SvXMLNumFormatContext::CreateAndInsert(bool /*bOverwrite*/, 
std::vector<SvXMLNumFormatContext*>& rCreateStack)
 {
     if (m_nKey <= -1)
-        CreateAndInsert(m_pData->GetNumberFormatter());
+        CreateAndInsert(m_pData->GetNumberFormatter(), rCreateStack);
 }
 
-sal_Int32 SvXMLNumFormatContext::CreateAndInsert(SvNumberFormatter* pFormatter)
+sal_Int32 SvXMLNumFormatContext::CreateAndInsert(SvNumberFormatter* 
pFormatter, std::vector<SvXMLNumFormatContext*>& rCreateStack)
 {
     if (!pFormatter)
     {
@@ -1569,20 +1578,22 @@ sal_Int32 
SvXMLNumFormatContext::CreateAndInsert(SvNumberFormatter* pFormatter)
         return -1;
     }
 
+    rCreateStack.push_back(this);
+
     sal_uInt32 nIndex = NUMBERFORMAT_ENTRY_NOT_FOUND;
 
     for (size_t i = 0; i < m_aMyConditions.size(); i++)
     {
         SvXMLNumFormatContext* pStyle = const_cast<SvXMLNumFormatContext*>( 
static_cast<const SvXMLNumFormatContext *>(m_pStyles->FindStyleChildContext(
             XmlStyleFamily::DATA_STYLE, m_aMyConditions[i].sMapName)));
-        if (this == pStyle)
+        if (std::find(rCreateStack.begin(), rCreateStack.end(), pStyle) != 
rCreateStack.end())
         {
             SAL_INFO("xmloff.style", "invalid style:map references containing 
style");
             pStyle = nullptr;
         }
         if (pStyle)
         {
-            if (pStyle->PrivateGetKey() > -1)     // don't reset pStyle's 
bRemoveAfterUse flag
+            if (pStyle->PrivateGetKey(rCreateStack) > -1)     // don't reset 
pStyle's bRemoveAfterUse flag
                 AddCondition(i);
         }
     }
@@ -1724,6 +1735,8 @@ sal_Int32 
SvXMLNumFormatContext::CreateAndInsert(SvNumberFormatter* pFormatter)
     if (!m_bRemoveAfterUse)
         GetImport().AddNumberStyle( m_nKey, GetName() );
 
+    rCreateStack.pop_back();
+
     return m_nKey;
 }
 

Reply via email to