diff options
author | Noel <noelgrandin@gmail.com> | 2020-11-16 15:58:10 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-12-18 06:54:06 +0100 |
commit | 8c9a4ff511a3b1d84a7a6d08a1b153c07f164abb (patch) | |
tree | 9bf5454718b572c33ccea18ae0c7cd6743d4381d /sot | |
parent | 6610266bde5a836d8ee1bfec6c8ab9d30c1d2529 (diff) |
throw exception in SvStream when reading past end of file
to avoid chasing weird problems where we read past the end
of file, which leads to random data in the variable we read into.
I expect a couple of possible regressions from this change
(1) memory leaks caused by non-exception-safe memory handling.
Of which there should not be much because we're pretty good
about using smart pointer classes these days.
(2) Broken files which used to load, will no longer do so.
These will have to be debugged by putting a breakpoint
on the SvStreamEOFException constructor, and examining
the backtrace to see where we should be catching and ignoring
the exception to make the code continue to handle such broken
files.
Change-Id: I351be031bb083a3484a9a1b650a58892700e6fb7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105936
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sot')
-rw-r--r-- | sot/source/sdstor/stg.cxx | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sot/source/sdstor/stg.cxx b/sot/source/sdstor/stg.cxx index 398e3fdb53d1..73a19719f86e 100644 --- a/sot/source/sdstor/stg.cxx +++ b/sot/source/sdstor/stg.cxx @@ -315,8 +315,17 @@ bool Storage::IsStorageFile( SvStream* pStream ) { StgHeader aHdr; sal_uInt64 nPos = pStream->Tell(); - bRet = ( aHdr.Load( *pStream ) && aHdr.Check() ); - + try + { + bRet = ( aHdr.Load( *pStream ) && aHdr.Check() ); + } + catch(SvStreamEOFException&) + { + // It's not a stream error if it is too small for an OLE storage header + pStream->ResetError(); + pStream->Seek( nPos ); + return false; + } // It's not a stream error if it is too small for an OLE storage header if ( pStream->GetErrorCode() == ERRCODE_IO_CANTSEEK ) pStream->ResetError(); |