sc/qa/unit/uicalc/data/simpleTable.xlsx |binary
 sc/qa/unit/uicalc/uicalc.cxx            |   15 +++++++++++++++
 sc/source/core/tool/dbdata.cxx          |    7 ++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

New commits:
commit 858be186f8e83e63e1b3bb1b9c1801760bf5ee48
Author:     Paris Oplopoios <paris.oplopo...@collabora.com>
AuthorDate: Wed Mar 8 23:04:49 2023 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Mar 16 20:06:35 2023 +0000

    tdf#154061 Make sure table column attributes size is correct
    
    Resize maTableColumnAttributes to match the amount of columns, fixes
    crash upon undoing a column insertion on a table
    
    Change-Id: Iad4b8ac5c38d5d1065d6ef1267ce3f5d3b28afa8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148492
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    (cherry picked from commit 2135706397d36aa7ea24650b65859be0b6860a65)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148972
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sc/qa/unit/uicalc/data/simpleTable.xlsx 
b/sc/qa/unit/uicalc/data/simpleTable.xlsx
new file mode 100644
index 000000000000..fd4e394732ba
Binary files /dev/null and b/sc/qa/unit/uicalc/data/simpleTable.xlsx differ
diff --git a/sc/qa/unit/uicalc/uicalc.cxx b/sc/qa/unit/uicalc/uicalc.cxx
index 42d0168aa833..98d3398b09d8 100644
--- a/sc/qa/unit/uicalc/uicalc.cxx
+++ b/sc/qa/unit/uicalc/uicalc.cxx
@@ -2025,6 +2025,21 @@ CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf142010)
     CPPUNIT_ASSERT_EQUAL(5.0, pDoc->GetValue(ScAddress(5, 71, 0)));
 }
 
+CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf154061)
+{
+    createScDoc("simpleTable.xlsx");
+    ScDocument* pDoc = getScDoc();
+    CPPUNIT_ASSERT_EQUAL(OUString("Column2"), pDoc->GetString(ScAddress(1, 0, 
0)));
+
+    goToCell("B1");
+
+    // Without the fix in place, it would crash here due to an out of bounds 
array access
+    dispatchCommand(mxComponent, ".uno:InsertColumnsBefore", {});
+    CPPUNIT_ASSERT_EQUAL(OUString("Column2"), pDoc->GetString(ScAddress(2, 0, 
0)));
+    dispatchCommand(mxComponent, ".uno:Undo", {});
+    CPPUNIT_ASSERT_EQUAL(OUString("Column2"), pDoc->GetString(ScAddress(1, 0, 
0)));
+}
+
 CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf132431)
 {
     createScDoc("tdf132431.ods");
diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index dc10d6a0503e..293bb20a4976 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -116,6 +116,7 @@ ScDBData::ScDBData( const ScDBData& rData ) :
     bAutoFilter         (rData.bAutoFilter),
     bModified           (rData.bModified),
     maTableColumnNames  (rData.maTableColumnNames),
+    maTableColumnAttributes(rData.maTableColumnAttributes),
     mbTableColumnNamesDirty(rData.mbTableColumnNamesDirty),
     nFilteredRowCount   (rData.nFilteredRowCount)
 {
@@ -150,6 +151,7 @@ ScDBData::ScDBData( const OUString& rName, const ScDBData& 
rData ) :
     bAutoFilter         (rData.bAutoFilter),
     bModified           (rData.bModified),
     maTableColumnNames  (rData.maTableColumnNames),
+    maTableColumnAttributes(rData.maTableColumnAttributes),
     mbTableColumnNamesDirty (rData.mbTableColumnNamesDirty),
     nFilteredRowCount   (rData.nFilteredRowCount)
 {
@@ -199,6 +201,7 @@ ScDBData& ScDBData::operator= (const ScDBData& rData)
         else
         {
             maTableColumnNames  = rData.maTableColumnNames;
+            maTableColumnAttributes = rData.maTableColumnAttributes;
             mbTableColumnNamesDirty = rData.mbTableColumnNamesDirty;
         }
 
@@ -577,6 +580,7 @@ void ScDBData::UpdateMoveTab(SCTAB nOldPos, SCTAB nNewPos)
                 aRange.aEnd.Row());
         // Do not use SetTableColumnNames() because that resets 
mbTableColumnNamesDirty.
         maTableColumnNames = aNames;
+        maTableColumnAttributes.resize(aNames.size());
         mbTableColumnNamesDirty = bTableColumnNamesDirty;
     }
 
@@ -620,6 +624,7 @@ bool ScDBData::UpdateReference(const ScDocument* pDoc, 
UpdateRefMode eUpdateRefM
             MoveTo( theTab1, theCol1, theRow1, theCol2, theRow2 );
         // Do not use SetTableColumnNames() because that resets 
mbTableColumnNamesDirty.
         maTableColumnNames = aNames;
+        maTableColumnAttributes.resize(aNames.size());
         mbTableColumnNamesDirty = bTableColumnNamesDirty;
     }
 
@@ -721,7 +726,6 @@ void ScDBData::AdjustTableColumnAttributes( UpdateRefMode 
eUpdateRefMode, SCCOL
                 n += nDx;
             aNewNames.resize(n);
             aNewAttributes.resize(n);
-            maTableColumnAttributes.resize(n);
             // Copy head.
             for (size_t i = 0; i < nHead; ++i)
             {
@@ -876,6 +880,7 @@ void ScDBData::RefreshTableColumnNames( ScDocument* pDoc )
     }
 
     aNewNames.swap( maTableColumnNames);
+    maTableColumnAttributes.resize(maTableColumnNames.size());
     mbTableColumnNamesDirty = false;
 }
 

Reply via email to