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; }