diff options
author | Paris Oplopoios <paris.oplopoios@collabora.com> | 2023-03-08 23:04:49 +0200 |
---|---|---|
committer | Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> | 2023-03-24 16:24:27 +0000 |
commit | 41ffe9b42bad5085072c94c18fc9b6d17528a7ef (patch) | |
tree | 9bbfeb460ed91090ed830b6c4defab326db4c5b1 | |
parent | ace3079172ed55d7408193a2f37bc9b16d1b3c39 (diff) |
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 <quikee@gmail.com>
(cherry picked from commit 2135706397d36aa7ea24650b65859be0b6860a65)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148972
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
(cherry picked from commit 3abe8c150d72eaef8dd2998ee13cdd2226ac2360)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149020
Tested-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
-rw-r--r-- | sc/qa/unit/uicalc/data/simpleTable.xlsx | bin | 0 -> 9454 bytes | |||
-rw-r--r-- | sc/qa/unit/uicalc/uicalc.cxx | 15 | ||||
-rw-r--r-- | sc/source/core/tool/dbdata.cxx | 7 |
3 files changed, 21 insertions, 1 deletions
diff --git a/sc/qa/unit/uicalc/data/simpleTable.xlsx b/sc/qa/unit/uicalc/data/simpleTable.xlsx Binary files differnew file mode 100644 index 000000000000..fd4e394732ba --- /dev/null +++ b/sc/qa/unit/uicalc/data/simpleTable.xlsx diff --git a/sc/qa/unit/uicalc/uicalc.cxx b/sc/qa/unit/uicalc/uicalc.cxx index 4976c19c17f0..25b4d0790383 100644 --- a/sc/qa/unit/uicalc/uicalc.cxx +++ b/sc/qa/unit/uicalc/uicalc.cxx @@ -2082,6 +2082,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; } |