diff options
author | dan <dan@noemail.net> | 2013-03-23 14:20:42 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2013-03-23 14:20:42 +0000 |
commit | 9d56c6df9aef1e9cb59246b010c55407ea1ab73b (patch) | |
tree | 3f873e34706ce121680f6d4f0ff803d7dc1478a2 /src | |
parent | 2753388e8ae49d71e7b3edc71793950aa002c07d (diff) | |
download | sqlite-9d56c6df9aef1e9cb59246b010c55407ea1ab73b.tar.gz sqlite-9d56c6df9aef1e9cb59246b010c55407ea1ab73b.zip |
Fix a case where a checkpoint operation could write to an invalid part of a memory mapped region.
FossilOrigin-Name: 8dbe89d05ce91428c69003f0da79d883fa23e2b5
Diffstat (limited to 'src')
-rw-r--r-- | src/pager.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/pager.c b/src/pager.c index 660514d50..09cc4a237 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4232,7 +4232,7 @@ static int syncJournal(Pager *pPager, int newHdr){ */ int sqlite3PagerSetFilesize(Pager *pPager, i64 szReq){ int rc; - sqlite3_int64 sz; + i64 sz; /* Size of file on disk in bytes */ assert( pPager->eState==PAGER_OPEN ); assert( pPager->nMmapOut==0 ); @@ -4244,13 +4244,13 @@ int sqlite3PagerSetFilesize(Pager *pPager, i64 szReq){ } } - if( rc==SQLITE_OK - && pPager->nMapLimit>0 - && pPager->nMapValid<szReq - && pPager->nMapValid<pPager->nMapLimit - ){ - pPager->dbFileSize = (szReq / pPager->pageSize); - rc = pagerMap(pPager, 1); + + if( rc==SQLITE_OK ){ + i64 szMap = (szReq > pPager->nMapLimit) ? pPager->nMapLimit : szReq; + if( pPager->nMapValid!=pPager->nMap || szMap!=pPager->nMap ){ + pPager->dbFileSize = (szReq / pPager->pageSize); + rc = pagerMap(pPager, 1); + } } return rc; |