sot/qa/cppunit/data/pass/fdo84229-1.compound |binary sot/qa/cppunit/test_sot.cxx | 26 ++++++++++++++++++++++++++ sot/source/sdstor/stgstrms.cxx | 15 +++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-)
New commits: commit 859b59ce572f5781f3e2fa9ae6416cfd65116ca3 Author: Michael Meeks <michael.me...@collabora.com> Date: Tue Dec 30 17:39:58 2014 +0000 fdo#84229 - don't set error when seeking beyond end of valid data. XclImpStream and elsewhere does an initial seek to the end, then a tell to work out the true length of the stream. In order to let us attempt to rescue data from the beginning of otherwise corrupt / truncated streams, we should avoid setting an error here. Interestingly, we also (probably) don't want to return the true length of the valid data - as this is how SotStorage has worked historically. Change-Id: Ie0ff0e183220b81871ae3bf83980a24b57ac8694 diff --git a/sot/source/sdstor/stgstrms.cxx b/sot/source/sdstor/stgstrms.cxx index b857c6d..0dbfe36 100644 --- a/sot/source/sdstor/stgstrms.cxx +++ b/sot/source/sdstor/stgstrms.cxx @@ -357,12 +357,16 @@ void StgStrm::scanBuildPageChainCache(sal_Int32 *pOptionalCalcSize) //returned second is false if it already exists if (!nUsedPageNumbers.insert(nBgn).second) + { + SAL_WARN ("sot", "Error: page number " << nBgn << " already in chain for stream"); bError = true; + } nOptSize += nPageSize; } if (bError) { + SAL_WARN("sot", "returning wrong format error"); if (pOptionalCalcSize) rIo.SetError( ERRCODE_IO_WRONGFORMAT ); m_aPagesCache.clear(); @@ -424,11 +428,18 @@ bool StgStrm::Pos2Page( sal_Int32 nBytePos ) if ( nIdx > m_aPagesCache.size() ) { - rIo.SetError( SVSTREAM_FILEFORMAT_ERROR ); + SAL_WARN("sot", "seek to index " << nIdx << + " beyond page cache size " << m_aPagesCache.size()); + // fdo#84229 - handle seek to end and back as eg. XclImpStream expects + nIdx = m_aPagesCache.size(); nPage = STG_EOF; - nOffset = nPageSize; + nOffset = 0; + // Intriguingly in the past we didn't reset nPos to match the real + // length of the stream thus: nPos = nPageSize * nIdx; so retain + // this behavior for now. return false; } + // special case: seek to 1st byte of new, unallocated page // (in case the file size is a multiple of the page size) if( nBytePos == nSize && !nOffset && nIdx > 0 && nIdx == m_aPagesCache.size() ) commit 0376706c11458c269d6736e17367ee3f0404c4e9 Author: Michael Meeks <michael.me...@collabora.com> Date: Tue Dec 30 17:38:12 2014 +0000 fdo#84229 - add sot storage unit test. Change-Id: Ic11c397984602bf8a2e292bc901cd7bf71ad555d diff --git a/sot/qa/cppunit/data/pass/fdo84229-1.compound b/sot/qa/cppunit/data/pass/fdo84229-1.compound new file mode 100644 index 0000000..46eb4da Binary files /dev/null and b/sot/qa/cppunit/data/pass/fdo84229-1.compound differ diff --git a/sot/qa/cppunit/test_sot.cxx b/sot/qa/cppunit/test_sot.cxx index c97a86e..92ade70 100644 --- a/sot/qa/cppunit/test_sot.cxx +++ b/sot/qa/cppunit/test_sot.cxx @@ -36,9 +36,11 @@ namespace unsigned int, unsigned int, unsigned int) SAL_OVERRIDE; void test(); + void testSize(); CPPUNIT_TEST_SUITE(SotTest); CPPUNIT_TEST(test); + CPPUNIT_TEST(testSize); CPPUNIT_TEST_SUITE_END(); }; @@ -120,6 +122,30 @@ namespace OUString()); } + void SotTest::testSize() + { + OUString aURL(getURLFromSrc("/sot/qa/cppunit/data/pass/fdo84229-1.compound")); + SvFileStream aStream(aURL, STREAM_READ); + SotStorageRef xObjStor = new SotStorage(aStream); + CPPUNIT_ASSERT_MESSAGE("sot storage failed to open", + xObjStor.Is() && !xObjStor->GetError()); + SotStorageStreamRef xStream = xObjStor->OpenSotStream("Book"); + CPPUNIT_ASSERT_MESSAGE("stream failed to open", + xStream.Is() && !xObjStor->GetError()); + CPPUNIT_ASSERT_MESSAGE("error in opened stream", !xStream->GetError()); + sal_uLong nPos = xStream->GetSize(); + CPPUNIT_ASSERT_MESSAGE("odd stream length", nPos == 13312); + + xStream->Seek(STREAM_SEEK_TO_END); + CPPUNIT_ASSERT_MESSAGE("error seeking to end", !xStream->GetError()); + // cf. comment in Pos2Page, not extremely intuitive ... + CPPUNIT_ASSERT_MESSAGE("stream not at beginning", xStream->Tell() == xStream->GetSize()); + xStream->Seek(STREAM_SEEK_TO_BEGIN); + + CPPUNIT_ASSERT_MESSAGE("error seeking to beginning", !xStream->GetError()); + CPPUNIT_ASSERT_MESSAGE("stream not at beginning", xStream->Tell() == 0); + } + CPPUNIT_TEST_SUITE_REGISTRATION(SotTest); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits