diff options
author | dan <dan@noemail.net> | 2010-06-10 06:53:26 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2010-06-10 06:53:26 +0000 |
commit | 026e598d0f2c94e0c8a4fb3eaf1aa343297aa74a (patch) | |
tree | 0443999992ec0108cc99d5d74df31b8b1b934e8a /src | |
parent | 0350c7fa2652a2bcbafe05cec9565f1741017af0 (diff) | |
download | sqlite-026e598d0f2c94e0c8a4fb3eaf1aa343297aa74a.tar.gz sqlite-026e598d0f2c94e0c8a4fb3eaf1aa343297aa74a.zip |
Store the MemPage structure in memory following, instead of preceding, the page data for cached pages. This reduces the likelihood of a corrupt database page image causing SQLite to read past the end of a buffer.
FossilOrigin-Name: 0ce42e76654d9ba52dac74c940d38b17866016ba
Diffstat (limited to 'src')
-rw-r--r-- | src/pcache.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/pcache.c b/src/pcache.c index 5762938ed..23ea0a7c7 100644 --- a/src/pcache.c +++ b/src/pcache.c @@ -260,15 +260,17 @@ int sqlite3PcacheFetch( if( pPage ){ if( !pPage->pData ){ - memset(pPage, 0, sizeof(PgHdr) + pCache->szExtra); - pPage->pExtra = (void*)&pPage[1]; - pPage->pData = (void *)&((char *)pPage)[sizeof(PgHdr) + pCache->szExtra]; + memset(pPage, 0, sizeof(PgHdr)); + pPage->pData = (void *)&pPage[1]; + pPage->pExtra = (void*)&((char *)pPage->pData)[pCache->szPage]; + memset(pPage->pExtra, 0, pCache->szExtra); pPage->pCache = pCache; pPage->pgno = pgno; } assert( pPage->pCache==pCache ); assert( pPage->pgno==pgno ); - assert( pPage->pExtra==(void *)&pPage[1] ); + assert( pPage->pData==(void *)&pPage[1] ); + assert( pPage->pExtra==(void *)&((char *)&pPage[1])[pCache->szPage] ); if( 0==pPage->nRef ){ pCache->nRef++; |