]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Better handle a malloc() failure in sqlite3PagerSetPagesize(). (CVS 4332)
authordanielk1977 <danielk1977@noemail.net>
Thu, 30 Aug 2007 10:07:38 +0000 (10:07 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 30 Aug 2007 10:07:38 +0000 (10:07 +0000)
FossilOrigin-Name: 41550d87c9395ab2fec5993655865e29235130a3

manifest
manifest.uuid
src/pragma.c
test/shared_err.test

index 43db9805ad71ad48c02b8574b3d7801eb31b5057..ac22c3bbfd5805d81b3a81c14a3c50abf051effa 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbug\sin\sa\stest\sfile\scausing\smalloc5.test\sto\scrash.\s(CVS\s4331)
-D 2007-08-30T08:27:40
+C Better\shandle\sa\smalloc()\sfailure\sin\ssqlite3PagerSetPagesize().\s(CVS\s4332)
+D 2007-08-30T10:07:39
 F Makefile.in bfcc303429a5d9dcd552d807ee016c77427418c3
 F Makefile.linux-gcc 65241babba6faf1152bf86574477baab19190499
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -123,7 +123,7 @@ F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
 F src/pager.c 847674a74c232f3f7c386d4b902df41a60f781c4
 F src/pager.h 1ac4468049348ec72df09d138fc1d7e3a9d0d3a6
 F src/parse.y 2d2ce439dc6184621fb0b86f4fc5aca7f391a590
-F src/pragma.c 65109b3d6a62f9a0d64e739653b76afa1122a00d
+F src/pragma.c 59a5e12ad0972ca2403503c12efb77f208c9a144
 F src/prepare.c 1506fd279824b1f4bac97514966d0370101f9a6b
 F src/printf.c e8cb99691b8370d0b721e2618db0ad01550e9b98
 F src/random.c 4a22746501bf36b0a088c66e38dde5daba6a35da
@@ -404,7 +404,7 @@ F test/server1.test f5b790d4c0498179151ca8a7715a65a7802c859c
 F test/shared.test 08b30d5f1939efff0517e7ff8ec7b74ad31c151b
 F test/shared2.test 0ee9de8964d70e451936a48c41cb161d9134ccf4
 F test/shared3.test 01e3e124dbb3859788aabc7cfb82f7ea04421749
-F test/shared_err.test ae8ba4ccca50e742c1b5fdbd504a2a0f3b3e67dd
+F test/shared_err.test 68455ec2f7f250d2e89f17b0c98ecf94009e6800
 F test/soak.test 64f9b27fbcdec43335a88c546ce1983e6ba40d7b
 F test/softheap1.test 0c49aa6eee25e7d32943e85e8d1f20eff566b1dc
 F test/sort.test 0e4456e729e5a92a625907c63dcdedfbe72c5dc5
@@ -568,7 +568,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 481fd3a89e50e329596d96565170e3d9977aae29
-R d13eabcd88c2079e0e183a72f4935be0
+P ab09967bd2dd291030850d44c0862fbb7d0d8118
+R b9c3cb63cea1b04e6323af6e1a9dc25c
 U danielk1977
-Z 1ec28bb5a6454a9a162a1baa77f48c30
+Z e4e84e997e319c0541326d008ac33a40
index ef0bb7c4ee2590706544bd8793e019fe9994e990..9dd3065cebc541407d66d1e2a1ff622f4a34890a 100644 (file)
@@ -1 +1 @@
-ab09967bd2dd291030850d44c0862fbb7d0d8118
\ No newline at end of file
+41550d87c9395ab2fec5993655865e29235130a3
\ No newline at end of file
index 873c76140a7ad1c51527b0f6806233b4eaf76cbd..6db457bbcc39d3eaa1467fccf095611f89f93a5b 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains code used to implement the PRAGMA command.
 **
-** $Id: pragma.c,v 1.147 2007/08/30 01:19:59 drh Exp $
+** $Id: pragma.c,v 1.148 2007/08/30 10:07:39 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -337,7 +337,12 @@ void sqlite3Pragma(
       int size = pBt ? sqlite3BtreeGetPageSize(pBt) : 0;
       returnSingleInt(pParse, "page_size", size);
     }else{
-      sqlite3BtreeSetPageSize(pBt, atoi(zRight), -1);
+      /* Malloc may fail when setting the page-size, as there is an internal
+      ** buffer that the pager module resizes using sqlite3_realloc().
+      */
+      if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, atoi(zRight), -1) ){
+        db->mallocFailed = 1;
+      }
     }
   }else
 
index 5000d27830852feac63698705031e7f858c10f98..d0d7cc642595208caf6d76639af5c171c6064537 100644 (file)
@@ -13,7 +13,7 @@
 # cache context. What happens to connection B if one connection A encounters
 # an IO-error whilst reading or writing the file-system?
 #
-# $Id: shared_err.test,v 1.15 2007/08/30 02:26:54 drh Exp $
+# $Id: shared_err.test,v 1.16 2007/08/30 10:07:39 danielk1977 Exp $
 
 proc skip {args} {}
 
@@ -433,6 +433,30 @@ do_test shared_malloc-8.X {
   expr $::aborted>=1
 } {1}
 
+# This test is designed to catch a specific bug that was present during
+# development of 3.5.0. If a malloc() failed while setting the page-size,
+# a buffer (Pager.pTmpSpace) was being freed. This could cause a seg-fault
+# later if another connection tried to use the pager.
+#
+# This test will crash 3.4.2.
+#
+do_malloc_test shared_err-9 -tclprep {
+  sqlite3 db2 test.db
+} -sqlbody {
+  PRAGMA page_size = 4096;
+  PRAGMA page_size = 1024;
+} -cleanup {
+  db2 eval {
+    CREATE TABLE abc(a, b, c);
+    BEGIN;
+    INSERT INTO abc VALUES(1, 2, 3);
+    ROLLBACK;
+  }     
+  db2 close
+}     
+
+
 catch {db close}
+catch {db2 close}
 sqlite3_enable_shared_cache $::enable_shared_cache
 finish_test