diff options
author | Attila Szűcs <szucs.attila3@nisz.hu> | 2020-12-08 18:22:07 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-12-09 20:25:08 +0100 |
commit | 8cfe270258d914e154b9db8b6ad02cd923984435 (patch) | |
tree | 509b32193eb597a8c04e12742727900ed1013881 /sc | |
parent | 5454d9fc5ed40ed43a8b961b5cb39571ab9df584 (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>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/data/xlsx/tdf138741_externalLinkSkipUnusedsCrash.xlsx | bin | 0 -> 6015 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export-test.cxx | 13 | ||||
-rw-r--r-- | sc/source/filter/excel/xelink.cxx | 2 | ||||
-rw-r--r-- | sc/source/ui/docshell/externalrefmgr.cxx | 2 |
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 Binary files differnew file mode 100644 index 000000000000..59102f2ab814 --- /dev/null +++ b/sc/qa/unit/data/xlsx/tdf138741_externalLinkSkipUnusedsCrash.xlsx diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index c02f4a08aa3d..9da6af5cde8b 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -268,6 +268,7 @@ public: void testTdf126305_DataValidatyErrorAlert(); void testTdf76047_externalLink(); void testTdf87973_externalLinkSkipUnuseds(); + void testTdf138741_externalLinkSkipUnusedsCrash(); void testTdf129969(); void testTdf84874(); void testTdf136721_paper_size(); @@ -440,6 +441,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 0522b042c67b..85afc7d6e307 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 6f032cafe090..c505e1501370 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) |