diff options
Diffstat (limited to 'sot/source/sdstor/stgio.cxx')
-rw-r--r-- | sot/source/sdstor/stgio.cxx | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/sot/source/sdstor/stgio.cxx b/sot/source/sdstor/stgio.cxx index b4c3008694ce..8b15a9e0734c 100644 --- a/sot/source/sdstor/stgio.cxx +++ b/sot/source/sdstor/stgio.cxx @@ -60,6 +60,8 @@ sal_Bool StgIo::Load() else return sal_False; } + else + return sal_False; } return Good(); } @@ -93,7 +95,7 @@ void StgIo::SetupStreams() if( pRoot ) { pDataFAT = new StgDataStrm( *this, aHdr.GetDataFATStart(), -1 ); - pDataStrm = new StgDataStrm( *this, pRoot ); + pDataStrm = new StgDataStrm( *this, *pRoot ); pDataFAT->SetIncrement( 1 << aHdr.GetPageSize() ); pDataStrm->SetIncrement( GetDataPageSize() ); pDataStrm->SetEntry( *pRoot ); @@ -115,7 +117,7 @@ short StgIo::GetDataPageSize() sal_Bool StgIo::CommitAll() { // Store the data (all streams and the TOC) - if( pTOC->Store() ) + if( pTOC && pTOC->Store() && pDataFAT ) { if( Commit() ) { @@ -152,7 +154,11 @@ public: sal_Int32 GetPageSize() { return nPageSize; } sal_Int32 Count() { return nPages; } - sal_Int32 operator[]( sal_Int32 nOffset ) { return pFat[ nOffset ]; } + sal_Int32 operator[]( sal_Int32 nOffset ) + { + OSL_ENSURE( nOffset >= 0 && nOffset < nPages, "Unexpected offset!" ); + return nOffset >= 0 && nOffset < nPages ? pFat[ nOffset ] : -2; + } sal_uLong Mark( sal_Int32 nPage, sal_Int32 nCount, sal_Int32 nExpect ); sal_Bool HasUnrefChains(); @@ -200,6 +206,8 @@ sal_uLong EasyFat::Mark( sal_Int32 nPage, sal_Int32 nCount, sal_Int32 nExpect ) sal_Int32 nCurPage = nPage; while( nCount != 0 ) { + if( nCurPage < 0 || nCurPage >= nPages ) + return FAT_OUTOFBOUNDS; pFree[ nCurPage ] = sal_False; nCurPage = pFat[ nCurPage ]; //Stream zu lang @@ -213,9 +221,6 @@ sal_uLong EasyFat::Mark( sal_Int32 nPage, sal_Int32 nCount, sal_Int32 nExpect ) nCount = 1; if( nCount != -1 ) nCount--; - // Naechster Block nicht in der FAT - if( nCount && ( nCurPage < 0 || nCurPage >= nPages ) ) - return FAT_OUTOFBOUNDS; } return FAT_OK; } @@ -259,6 +264,9 @@ sal_uLong Validator::ValidateMasterFATs() { sal_Int32 nCount = rIo.aHdr.GetFATSize(); sal_uLong nErr; + if ( !rIo.pFAT ) + return FAT_INMEMORYERROR; + for( sal_Int32 i = 0; i < nCount; i++ ) { if( ( nErr = aFat.Mark(rIo.pFAT->GetPage( short(i), sal_False ), aFat.GetPageSize(), -3 )) != FAT_OK ) @@ -267,11 +275,15 @@ sal_uLong Validator::ValidateMasterFATs() if( rIo.aHdr.GetMasters() ) if( ( nErr = aFat.Mark(rIo.aHdr.GetFATChain( ), aFat.GetPageSize(), -4 )) != FAT_OK ) return nErr; + return FAT_OK; } sal_uLong Validator::MarkAll( StgDirEntry *pEntry ) { + if ( !pEntry ) + return FAT_INMEMORYERROR; + StgIterator aIter( *pEntry ); sal_uLong nErr = FAT_OK; for( StgDirEntry* p = aIter.First(); p ; p = aIter.Next() ) @@ -298,6 +310,9 @@ sal_uLong Validator::MarkAll( StgDirEntry *pEntry ) sal_uLong Validator::ValidateDirectoryEntries() { + if ( !rIo.pTOC ) + return FAT_INMEMORYERROR; + // Normale DirEntries sal_uLong nErr = MarkAll( rIo.pTOC->GetRoot() ); if( nErr != FAT_OK ) @@ -347,7 +362,11 @@ sal_uLong StgIo::ValidateFATs() Validator *pV = new Validator( *this ); sal_Bool bRet1 = !pV->IsError(), bRet2 = sal_True ; delete pV; + SvFileStream *pFileStrm = ( SvFileStream *) GetStrm(); + if ( !pFileStrm ) + return FAT_INMEMORYERROR; + StgIo aIo; if( aIo.Open( pFileStrm->GetFileName(), STREAM_READ | STREAM_SHARE_DENYNONE) && |