summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorAttila Szűcs <szucs.attila3@nisz.hu>2020-12-08 18:22:07 +0100
committerXisco Fauli <xiscofauli@libreoffice.org>2020-12-10 10:48:54 +0100
commit172b81479451f0af2978dfa2eba1f9d105b946c9 (patch)
treea10b9864f2c8d74d01e6470509e7de934a009f20 /sc
parentf527846ab9a67387909d225aaeb77301d2b48d5a (diff)
tdf#138741 XLSX export: fix crash in setSkipUnusedFileIds
Changed size of maConvertFileIdToUsedFileId vector to the same as maSrcFiles size. Some external references was not inserted into maRefCells, that resulted a smaller maConvertFileIdToUsedFileId as was needed. This crash was caused by: tdf#87973 XLSX export: fix lost file names in modified links f85d860ccbebd99bc128218148e2992c9415f221 Co-authored-by: Tibor Nagy (NISZ) Change-Id: I1501f5222483bf3e9e41c9e921a024320231dce8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107434 Tested-by: Caolán McNamara <caolanm@redhat.com> Reviewed-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit 8cfe270258d914e154b9db8b6ad02cd923984435) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107481 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/unit/data/xlsx/tdf138741_externalLinkSkipUnusedsCrash.xlsxbin0 -> 6015 bytes
-rw-r--r--sc/qa/unit/subsequent_export-test.cxx13
-rw-r--r--sc/source/filter/excel/xelink.cxx2
-rw-r--r--sc/source/ui/docshell/externalrefmgr.cxx2
4 files changed, 16 insertions, 1 deletions
diff --git a/sc/qa/unit/data/xlsx/tdf138741_externalLinkSkipUnusedsCrash.xlsx b/sc/qa/unit/data/xlsx/tdf138741_externalLinkSkipUnusedsCrash.xlsx
new file mode 100644
index 000000000000..59102f2ab814
--- /dev/null
+++ b/sc/qa/unit/data/xlsx/tdf138741_externalLinkSkipUnusedsCrash.xlsx
Binary files differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index ba5764e4841c..03d63baeeabd 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -271,6 +271,7 @@ public:
void testTdf126305_DataValidatyErrorAlert();
void testTdf76047_externalLink();
void testTdf87973_externalLinkSkipUnuseds();
+ void testTdf138741_externalLinkSkipUnusedsCrash();
void testTdf129969();
void testTdf84874();
void testTdf136721_paper_size();
@@ -443,6 +444,7 @@ public:
CPPUNIT_TEST(testTdf126305_DataValidatyErrorAlert);
CPPUNIT_TEST(testTdf76047_externalLink);
CPPUNIT_TEST(testTdf87973_externalLinkSkipUnuseds);
+ CPPUNIT_TEST(testTdf138741_externalLinkSkipUnusedsCrash);
CPPUNIT_TEST(testTdf129969);
CPPUNIT_TEST(testTdf84874);
CPPUNIT_TEST(testTdf136721_paper_size);
@@ -5580,6 +5582,17 @@ void ScExportTest::testTdf87973_externalLinkSkipUnuseds()
pDocSh->DoClose();
}
+void ScExportTest::testTdf138741_externalLinkSkipUnusedsCrash()
+{
+ ScDocShellRef xShell = loadDoc("tdf138741_externalLinkSkipUnusedsCrash.", FORMAT_XLSX);
+ CPPUNIT_ASSERT(xShell);
+
+ //without the fix in place, it would have crashed at export time
+ ScBootstrapFixture::exportTo(&(*xShell), FORMAT_XLSX);
+
+ xShell->DoClose();
+}
+
void ScExportTest::testTdf129969()
{
ScDocShellRef xShell = loadDoc("external_hyperlink.", FORMAT_ODS);
diff --git a/sc/source/filter/excel/xelink.cxx b/sc/source/filter/excel/xelink.cxx
index 69037d483e7b..affc984234f5 100644
--- a/sc/source/filter/excel/xelink.cxx
+++ b/sc/source/filter/excel/xelink.cxx
@@ -2084,6 +2084,8 @@ void XclExpSupbookBuffer::SaveXml( XclExpXmlStream& rStrm )
for (size_t nPos = 0, nSize = maSupbookList.GetSize(); nPos < nSize; ++nPos)
{
XclExpSupbookRef xRef(maSupbookList.GetRecord(nPos));
+ // fileIDs are indexed from 1 in xlsx, and from 0 in ScExternalRefManager
+ // converting between them require a -1 or +1
if (xRef->GetType() == XclSupbookType::Extern)
aExternFileIds.push_back(xRef->GetFileId() - 1);
}
diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx
index 942753693507..9bb744b07049 100644
--- a/sc/source/ui/docshell/externalrefmgr.cxx
+++ b/sc/source/ui/docshell/externalrefmgr.cxx
@@ -2751,7 +2751,7 @@ sal_uInt16 ScExternalRefManager::convertFileIdToUsedFileId(sal_uInt16 nFileId)
void ScExternalRefManager::setSkipUnusedFileIds(std::vector<sal_uInt16>& rExternFileIds)
{
mbSkipUnusedFileIds = true;
- maConvertFileIdToUsedFileId.resize(maRefCells.size());
+ maConvertFileIdToUsedFileId.resize(maSrcFiles.size());
std::fill(maConvertFileIdToUsedFileId.begin(), maConvertFileIdToUsedFileId.end(), 0);
int nUsedCount = 0;
for (auto nEntry : rExternFileIds)