summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParis Oplopoios <paris.oplopoios@collabora.com>2023-03-08 23:04:49 +0200
committerChristian Lohmaier <lohmaier+LibreOffice@googlemail.com>2023-03-24 16:24:27 +0000
commit41ffe9b42bad5085072c94c18fc9b6d17528a7ef (patch)
tree9bbfeb460ed91090ed830b6c4defab326db4c5b1
parentace3079172ed55d7408193a2f37bc9b16d1b3c39 (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.xlsxbin0 -> 9454 bytes
-rw-r--r--sc/qa/unit/uicalc/uicalc.cxx15
-rw-r--r--sc/source/core/tool/dbdata.cxx7
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
new file mode 100644
index 000000000000..fd4e394732ba
--- /dev/null
+++ b/sc/qa/unit/uicalc/data/simpleTable.xlsx
Binary files differ
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;
}