aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <dan@noemail.net>2010-06-10 06:53:26 +0000
committerdan <dan@noemail.net>2010-06-10 06:53:26 +0000
commit026e598d0f2c94e0c8a4fb3eaf1aa343297aa74a (patch)
tree0443999992ec0108cc99d5d74df31b8b1b934e8a /src
parent0350c7fa2652a2bcbafe05cec9565f1741017af0 (diff)
downloadsqlite-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.c10
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++;