]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem in btree.c that could cause a crash following an OOM. Also various...
authordan <dan@noemail.net>
Fri, 29 Mar 2013 18:52:56 +0000 (18:52 +0000)
committerdan <dan@noemail.net>
Fri, 29 Mar 2013 18:52:56 +0000 (18:52 +0000)
FossilOrigin-Name: e8bcdf938eee2c307c24d60d0295e5529291373b

manifest
manifest.uuid
src/btree.c
src/os_unix.c
test/mallocH.test
test/pagerfault.test
test/tester.tcl

index d8d29697455fc7427b28a1169ef0e356995fc020..419a905bdc30696121b8c533ef9a3a9eb2e0c027 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\sassuming\sthe\spage-size\sis\s4096\sbytes\sin\sos_unix.c.
-D 2013-03-29T11:24:15.742
+C Fix\sa\sproblem\sin\sbtree.c\sthat\scould\scause\sa\scrash\sfollowing\san\sOOM.\sAlso\svarious\stest\sscript\sproblems.
+D 2013-03-29T18:52:56.780
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in df3e48659d80e1b7765785d8d66c86b320f72cc7
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -121,7 +121,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
 F src/backup.c b2cac9f7993f3f9588827b824b1501d0c820fa68
 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
-F src/btree.c 19b587b32569d4b92651b5eaa9de2e59c6f8f704
+F src/btree.c 84c9a4a20b827a6f7dbcbcda59607dbee57af446
 F src/btree.h d9490cd37aaeb530a41b07f06e1262950b1be916
 F src/btreeInt.h eecc84f02375b2bb7a44abbcbbe3747dde73edb2
 F src/build.c 083da8466fd7e481cb8bd5264398f537507f6176
@@ -160,7 +160,7 @@ F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30
 F src/os.c 809d0707cec693e1b9b376ab229271ad74c3d35d
 F src/os.h ae08bcc5f6ec6b339f4a2adf3931bb88cc14c3e4
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
-F src/os_unix.c 68b5606c0b7540e8cca8b57e39d2504da3e9d825
+F src/os_unix.c 0bebbe673f2831ce29c8da5f58f74e6c40c231ab
 F src/os_win.c e4f17ddf79f2a9373e33ed70565e765d65324589
 F src/pager.c 30009ae5800f80e21da1f118fabfc72b34d8c722
 F src/pager.h 5cb78b8e1adfd5451e600be7719f5a99d87ac3b1
@@ -607,7 +607,7 @@ F test/mallocD.test f78c295e8e18ea3029e65ca08278690e00c22100
 F test/mallocE.test db1ed69d7eded1b080952e2a7c37f364ad241b08
 F test/mallocF.test 2d5c590ebc2fc7f0dcebdf5aa8498b9aed69107e
 F test/mallocG.test 0ff91b65c50bdaba680fb75d87fe4ad35bb7934f
-F test/mallocH.test 79b65aed612c9b3ed2dcdaa727c85895fd1bfbdb
+F test/mallocH.test c43a1899a56833ad42cf7a159f7d2eeb364833e6
 F test/mallocI.test a88c2b9627c8506bf4703d8397420043a786cdb6
 F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e
 F test/mallocK.test d79968641d1b70d88f6c01bdb9a7eb4a55582cc9
@@ -651,7 +651,7 @@ F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3
 F test/pager1.test aa819efb5c58cef7afd0504849f3ab27eaa926a3
 F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1
 F test/pager3.test 3856d9c80839be0668efee1b74811b1b7f7fc95f
-F test/pagerfault.test 452f2cc23e3bfcfa935f4442aec1da4fe1dc0442
+F test/pagerfault.test 0c12520f6c8883ec401b8b7b5406ca24657566a1
 F test/pagerfault2.test 1f79ea40d1133b2683a2f811b00f2399f7ec2401
 F test/pagerfault3.test f16e2efcb5fc9996d1356f7cbc44c998318ae1d7
 F test/pageropt.test 32cb5a6ed7ccddf8e8c842cb44240bd9340223ce
@@ -755,7 +755,7 @@ F test/tclsqlite.test 37a61c2da7e3bfe3b8c1a2867199f6b860df5d43
 F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
 F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
 F test/temptrigger.test 26670ed7a39cf2296a7f0a9e0a1d7bdb7abe936d
-F test/tester.tcl e96eee651b5cea4c3a1b6f504b218e1da95c6980
+F test/tester.tcl b40aa7ab9616ad148bf2c97758700c2edc7dfa2b
 F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5
 F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58
 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7
@@ -1040,7 +1040,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 0e3d5119273fd8e3512b3aa4272a873847e7ca40
-R 0258b214f7324bb0bb55e8d7d2f07b38
+P 3b7ec8d79e35e38df990e315c4ef9c7ab678bcbf
+R c70b3a1f7e66852328a5f388646bf53c
 U dan
-Z 2a10b8594aa4021d16da3af2824221c8
+Z f06400ae1e815eb0188e6d5288e4e140
index 187aa91adef23272c7c4e39253bc001372ee608c..b2f9b72eca921adfec090fa4dda47ae8f07e3060 100644 (file)
@@ -1 +1 @@
-3b7ec8d79e35e38df990e315c4ef9c7ab678bcbf
\ No newline at end of file
+e8bcdf938eee2c307c24d60d0295e5529291373b
\ No newline at end of file
index 7d2f2d38409c0b80ae75295edc81c3462e3b581e..03764a9267c2712554a155d1f3fe375937b6a0c4 100644 (file)
@@ -2596,12 +2596,13 @@ static int btreeSwapOutMmap(BtShared *pBt){
       if( pPg && pPg->pDbPage->flags & PGHDR_MMAP ){
         MemPage *pNew = 0;
         rc = getAndInitPage(pBt, pPg->pgno, &pNew, 0);
-        if( rc==SQLITE_OK && pCsr->iPage==0 ){
-          pCsr->info.pCell = pNew->aData + (pCsr->info.pCell - pPg->aData);
+        if( rc==SQLITE_OK ){
+          if( pCsr->iPage==0 ){
+            pCsr->info.pCell = pNew->aData + (pCsr->info.pCell - pPg->aData);
+          }
+          pCsr->apPage[0] = pNew;
+          releasePage(pPg);
         }
-        pCsr->apPage[0] = pNew;
-        releasePage(pPg);
-        if( rc!=SQLITE_OK ) return rc;
       }
     }
   }
index dd4a6a04206658f448be25359ad9209869d5411a..53d3fec8065d6313c4fe4a131e947515769e9d66 100644 (file)
@@ -4645,7 +4645,7 @@ static int unixMapfile(unixFile *pFd, i64 nByte){
         unixMapping *pMap = &pFd->aMmap[0];
         pNew = osMremap(
             pMap->pMapRegion, pMap->mmapOrigsize, nMap, MREMAP_MAYMOVE
-            );
+        );
         if( pNew==MAP_FAILED ){
           return SQLITE_IOERR_MMAP;
         }
index 7017b381ab1d8595648ab3be0d28423072878350..95c08f05146d861a80fc68ecc0876a100c7b77ee 100644 (file)
@@ -62,6 +62,7 @@ ifcapable explain {
 # Malloc failure during integrity_check pragma.
 #
 do_malloc_test mallocH-5 -sqlprep {
+   PRAGMA mmap_limit = 0;
    CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
    CREATE TABLE t2(x,y);
    INSERT INTO t1 VALUES(1,2);
index e04e97e4fc8510b8b23c10dc24edc4c82ecef36c..e625f1fd9f5dcaf9b84c4527353cb83e93f47930 100644 (file)
@@ -1201,12 +1201,13 @@ do_faultsim_test pagerfault-26 -prep {
   set contents [db eval {SELECT * FROM t1}]
   if {$contents != "1 2"} { error "Bad database contents ($contents)" }
 
-  set sz [file size test.db]
-  if {$testrc!=0 && $sz!=1024*3 && $sz!=4096*3} { 
-    error "Expected file size to be 3072 or 12288 bytes - actual size $sz bytes"
+  set nPg [file_page_count test.db]
+  set pgsz [file_page_size test.db]
+  if {$testrc!=0 && ($nPg!=3 || ($pgsz!=1024 && $pgsz!=4096))} {
+    error "File should be 3 pages. Page size 1024 or 4096 bytes. Is $nPg/$pgsz."
   }
-  if {$testrc==0 && $sz!=4096*3} { 
-    error "Expected file size to be 12288 bytes - actual size $sz bytes"
+  if {$testrc==0 && ($nPg!=3 || $pgsz!=4096)} {
+    error "File should be 3 pages. Page size 4096 bytes. Is $nPg/$pgsz."
   }
 } 
 
index ba1cfd7f32156bb6108f7309ac814b9d118c5395..faa56114dabb82784e21ce5b69a0f60988926583 100644 (file)
@@ -1680,6 +1680,18 @@ proc db_delete_and_reopen {{file test.db}} {
 #
 proc file_page_count {zFile} {
   set nPg [hexio_get_int [hexio_read $zFile 28 4]]
+  set pgsz [file_page_size $zFile]
+  set filesz [file size $zFile]
+  set syspgsz 4096
+
+  # Check that the file size is consistent with the database page size,
+  # the page count, and the system page size.
+  if {($filesz < ($nPg * $pgsz))
+   || ($filesz > (((($nPg * $pgsz)+$syspgsz-1) / $syspgsz) * $syspgsz))
+  } {
+    error "file_size=$filesz. page_count=$nPg. page_size=$pgsz."
+  }
+
   return $nPg
 }