sc/source/filter/inc/XclExpChangeTrack.hxx   |    3 ++
 sc/source/filter/xcl97/XclExpChangeTrack.cxx |   36 ++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

New commits:
commit 650ab6e645c51aaffc8dc5e638295d6da74d44ff
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Mon Jul 3 21:19:10 2023 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Jul 4 10:08:39 2023 +0200

    crashtesting: assert on exporting fdo68105-1.ods to xls
    
    and ooo101471-3.ods to xls
    
    Change-Id: Ieb5339664a2bb647e8a09a44e60cad651bf65247
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153933
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx 
b/sc/source/filter/inc/XclExpChangeTrack.hxx
index a6cdeff93cab..b23b6f8cdcaf 100644
--- a/sc/source/filter/inc/XclExpChangeTrack.hxx
+++ b/sc/source/filter/inc/XclExpChangeTrack.hxx
@@ -305,6 +305,7 @@ public:
     void                        InitFillup();
 
     sal_uInt16                  GetId( sal_uInt16 nIndex ) const;
+    bool                        HasId( sal_uInt16 nIndex ) const;
     void                        Remove();
 
     sal_uInt16           GetBufferCount() const
@@ -465,6 +466,8 @@ struct XclExpChTrData
     void                        Write(
                                     XclExpStream& rStrm,
                                     const XclExpChTrTabIdBuffer& rTabIdBuffer 
);
+
+    bool                        UsesDeletedTab(const XclExpChTrTabIdBuffer& 
rTabIdBuffer) const;
 };
 
 // XclExpChTrCellContent - changed cell content
diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx 
b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
index 24da37109d29..9c22af8a6420 100644
--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx
+++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
@@ -577,6 +577,11 @@ sal_uInt16 XclExpChTrTabIdBuffer::GetId( sal_uInt16 nIndex 
) const
     return pBuffer[ nIndex ];
 }
 
+bool XclExpChTrTabIdBuffer::HasId( sal_uInt16 nIndex ) const
+{
+    return nIndex < nBufSize;
+}
+
 void XclExpChTrTabIdBuffer::Remove()
 {
     OSL_ENSURE( pBuffer.get() <= pLast, "XclExpChTrTabIdBuffer::Remove - 
buffer empty" );
@@ -807,6 +812,31 @@ void XclExpChTrData::Write( XclExpStream& rStrm, const 
XclExpChTrTabIdBuffer& rT
     }
 }
 
+static bool lcl_IsDeletedTab(const XclExpChTrTabIdBuffer& rTabIdBuffer, 
sal_uInt16 nIndex)
+{
+    return !rTabIdBuffer.HasId(nIndex);
+}
+
+bool XclExpChTrData::UsesDeletedTab(const XclExpChTrTabIdBuffer& rTabIdBuffer) 
const
+{
+    if (nType != EXC_CHTR_TYPE_FORMULA)
+        return false;
+
+    for( const auto& rLogEntry : maRefLog )
+    {
+        if (rLogEntry.mpUrl && rLogEntry.mpFirstTab)
+            continue;
+        if (lcl_IsDeletedTab(rTabIdBuffer, rLogEntry.mnFirstXclTab))
+            return true;
+        bool bSingleTab = rLogEntry.mnFirstXclTab == rLogEntry.mnLastXclTab;
+        if (!bSingleTab)
+            continue;
+        if (lcl_IsDeletedTab(rTabIdBuffer, rLogEntry.mnLastXclTab))
+            return true;
+    }
+    return false;
+}
+
 XclExpChTrCellContent::XclExpChTrCellContent(
         const ScChangeActionContent& rAction,
         const XclExpRoot& rRoot,
@@ -934,7 +964,11 @@ void XclExpChTrCellContent::GetCellData(
 
 bool XclExpChTrCellContent::UsesDeletedTab() const
 {
-    return IsDeletedTab(aPosition.Tab());
+    if (IsDeletedTab(aPosition.Tab()))
+        return true;
+    if (pOldData && pOldData->UsesDeletedTab(rIdBuffer))
+        return true;
+    return pNewData && pNewData->UsesDeletedTab(rIdBuffer);
 }
 
 void XclExpChTrCellContent::SaveActionData( XclExpStream& rStrm ) const

Reply via email to