You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by hd...@apache.org on 2012/03/16 11:52:56 UTC
svn commit: r1301428 -
/incubator/ooo/trunk/main/desktop/source/deployment/dp_persmap.cxx
Author: hdu
Date: Fri Mar 16 10:52:55 2012
New Revision: 1301428
URL: http://svn.apache.org/viewvc?rev=1301428&view=rev
Log:
#i119048# handle edge cases when importing BDB hash files
Modified:
incubator/ooo/trunk/main/desktop/source/deployment/dp_persmap.cxx
Modified: incubator/ooo/trunk/main/desktop/source/deployment/dp_persmap.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/desktop/source/deployment/dp_persmap.cxx?rev=1301428&r1=1301427&r2=1301428&view=diff
==============================================================================
--- incubator/ooo/trunk/main/desktop/source/deployment/dp_persmap.cxx (original)
+++ incubator/ooo/trunk/main/desktop/source/deployment/dp_persmap.cxx Fri Mar 16 10:52:55 2012
@@ -372,45 +372,62 @@ bool PersistentMap::importFromBDB()
nOfs += nBytesRead;
}
- // check BDB file header for non_encrypted Hash_v9 format
- if( nFileSize < 0x1000)
+ // check BDB file header for non_encrypted Hash format v4..9
+ if( nFileSize < 0x0100)
return false;
- if( (aRawBDB[12]!=0x61 || aRawBDB[13]!=0x15 || aRawBDB[14]!=0x06)
- && (aRawBDB[15]!=0x61 || aRawBDB[14]!=0x15 || aRawBDB[13]!=0x06))
+ if( aRawBDB[24] != 0) // only not-encrypted migration
return false;
- if( aRawBDB[16]!=0x09)
+ if( aRawBDB[25] != 8) // we expect a P_HASHMETA page
return false;
-
- // find PackageManagers new_style entries
- // using a simple heuristic for BDB_Hash_v9 files
+ const bool bLE = (aRawBDB[12]==0x61 && aRawBDB[13]==0x15 && aRawBDB[14]==0x06);
+ const bool bBE = (aRawBDB[15]==0x61 && aRawBDB[14]==0x15 && aRawBDB[13]==0x06);
+ if( bBE == bLE)
+ return false;
+ if( (aRawBDB[16] < 4) || (9 < aRawBDB[16])) // version
+ return false;
+ const sal_uInt64 nPgSize = bLE
+ ? (aRawBDB[20] + (aRawBDB[21]<<8) + (aRawBDB[22]<<16) + (aRawBDB[23]<<24))
+ : (aRawBDB[23] + (aRawBDB[22]<<8) + (aRawBDB[21]<<16) + (aRawBDB[20]<<24));
+ const int nPgCount = nFileSize / nPgSize;
+ if( nPgCount * nPgSize != nFileSize)
+ return false;
+
+ // find PackageManager's new_style entries
+ // using a simple heuristic for BDB_Hash pages
int nEntryCount = 0;
- const sal_uInt8* pBeg = &aRawBDB[0] + 0x1000;
- const sal_uInt8* pEnd = pBeg + nFileSize;
- for( const sal_uInt8* pCur = pBeg; pCur < pEnd; ++pCur) {
- if( pCur[0] != 0x01)
- continue;
- // get the value-candidate
- const sal_uInt8* pVal = pCur + 1;
- while( ++pCur < pEnd)
- if( (*pCur < ' ') || ((*pCur > 0x7F) && (*pCur != 0xFF)))
- break;
- if( pCur >= pEnd)
- break;
- if( (pCur[0] != 0x01) || (pCur[1] != 0xFF))
- continue;
- const OString aVal( (sal_Char*)pVal, pCur - pVal);
- // get the key-candidate
- const sal_uInt8* pKey = pCur + 1;
- while( ++pCur < pEnd)
- if( (*pCur < ' ') || ((*pCur > 0x7F) && (*pCur != 0xFF)))
+ for( int nPgNo = 1; nPgNo < nPgCount; ++nPgNo) {
+ // parse the next _db_page
+ const sal_uInt8* const pPage = &aRawBDB[ nPgNo * nPgSize];
+ const sal_uInt8* const pEnd = pPage + nPgSize;
+ const int nHfOffset = bLE ? (pPage[22] + (pPage[23]<<8)) : (pPage[23] + (pPage[22]<<8));
+ const sal_uInt8* pCur = pPage + nHfOffset;
+ // iterate through the entries
+ for(; pCur < pEnd; ++pCur) {
+ if( pCur[0] != 0x01)
+ continue;
+ // get the value-candidate
+ const sal_uInt8* pVal = pCur + 1;
+ while( ++pCur < pEnd)
+ if( (*pCur < ' ') || ((*pCur > 0x7F) && (*pCur != 0xFF)))
+ break;
+ if( pCur >= pEnd)
break;
- if( (pCur < pEnd) && (*pCur > 0x01))
- continue;
- const OString aKey( (sal_Char*)pKey, pCur - pKey);
-
- // add the key/value pair
- add( aKey, aVal);
- ++nEntryCount;
+ if( (pCur[0] != 0x01) || (pCur[1] != 0xFF))
+ continue;
+ const OString aVal( (sal_Char*)pVal, pCur - pVal);
+ // get the key-candidate
+ const sal_uInt8* pKey = pCur + 1;
+ while( ++pCur < pEnd)
+ if( (*pCur < ' ') || ((*pCur > 0x7F) && (*pCur != 0xFF)))
+ break;
+ if( (pCur < pEnd) && (*pCur > 0x01))
+ continue;
+ const OString aKey( (sal_Char*)pKey, pCur - pKey);
+
+ // add the key/value pair
+ add( aKey, aVal);
+ ++nEntryCount;
+ }
}
return (nEntryCount > 0);