aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan <dan@noemail.net>2013-03-23 14:20:42 +0000
committerdan <dan@noemail.net>2013-03-23 14:20:42 +0000
commit9d56c6df9aef1e9cb59246b010c55407ea1ab73b (patch)
tree3f873e34706ce121680f6d4f0ff803d7dc1478a2 /src
parent2753388e8ae49d71e7b3edc71793950aa002c07d (diff)
downloadsqlite-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.c16
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;