]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that the db.mallocFailed flag is cleared before sqlite3_errmsg16() returns...
authordanielk1977 <danielk1977@noemail.net>
Thu, 22 May 2008 13:56:17 +0000 (13:56 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 22 May 2008 13:56:17 +0000 (13:56 +0000)
FossilOrigin-Name: 0d47653a3c39b7cd41c7e6edd8c4b4543658412d

manifest
manifest.uuid
src/main.c
src/prepare.c
test/shared_err.test

index 2ea5351ff6d52783fa709ce1aeff107ba8071ce2..9d9769f38d370e0bf43965b07ae51e78a9681f38 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\s"volatile"\skeyword\sto\svariables\sin\sthe\sPager\sstructure\sused\sfor\nsynchronization\swhen\smemory\smanagement\sis\senabled.\s(CVS\s5153)
-D 2008-05-21T15:38:15
+C Ensure\sthat\sthe\sdb.mallocFailed\sflag\sis\scleared\sbefore\ssqlite3_errmsg16()\sreturns.\s(CVS\s5154)
+D 2008-05-22T13:56:17
 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
 F Makefile.in 79aeba12300a54903f1b1257c1e7c190234045dd
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -102,7 +102,7 @@ F src/insert.c 77f0829b3e2edd19e9238195c56b0d56ab000f17
 F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e
 F src/legacy.c 8f5a2b25d9673b4004287cf2bf51dbf7d0738406
 F src/loadext.c eac6c61810a3b531808774bec7f3d238cfe261f3
-F src/main.c 2d1cf908a2e874f9bad7e8bff6b93c057dff6ba7
+F src/main.c cf415e0920dc9f66806dd766ad72ba5cda533363
 F src/malloc.c 12c1ae98ef1eff34b13c9eb526e0b7b479e1e820
 F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a
 F src/mem1.c fc716ff521b6dd3e43eaa211967383308800e70a
@@ -125,7 +125,7 @@ F src/pager.c d0a77feeaeecaaaec9342a3bb3865ed9a490897a
 F src/pager.h 4f051fd856de6fd3c19aef5f82eace54122b9173
 F src/parse.y fc4bd35c6088901f7c8daead26c6fb11c87d22e7
 F src/pragma.c a4919a29a0923e00c6170b0677a50058e352b58c
-F src/prepare.c adc7e1fc08dfbab63cd213d4c0aff8f3fa70d477
+F src/prepare.c dbc9b592997ee8ad5e9f97322534daada553f042
 F src/printf.c f2d4f6c5b0ec24b643e85fe60258adad8b1f6acc
 F src/random.c 2b2db2de4ab491f5a14d3480466f8f4b5a5db74a
 F src/select.c da43ce3080112aa77863e9c570c1df19a892acb8
@@ -435,7 +435,7 @@ F test/server1.test f5b790d4c0498179151ca8a7715a65a7802c859c
 F test/shared.test c6769531e0cb751d46a9838c0532d3786606c0f6
 F test/shared2.test 0ee9de8964d70e451936a48c41cb161d9134ccf4
 F test/shared3.test 01e3e124dbb3859788aabc7cfb82f7ea04421749
-F test/shared_err.test 202ce115a4bfab2b41da5d4c9431f68a474134a6
+F test/shared_err.test 10157148055f1b96373bcc59ecd4e84a83e22a81
 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
 F test/sidedelete.test 736ac1da08b3b1aa62df97fef2fcdb1b660111b9
 F test/soak.test 64f9b27fbcdec43335a88c546ce1983e6ba40d7b
@@ -636,7 +636,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 235e384eca65d5007e8e0c440904eb254f9b976a
-R bd9892fd17c2d2b279ed03b570f23df7
-U drh
-Z 1856d468393c5ff533277bf646b25f29
+P 25b9f3b9b2d996ab4582b22b695c4dbd94d09cc7
+R 1aff04e878d28f7a24a4493a69449176
+U danielk1977
+Z f40b5d93825daedb779203833c7a0c3b
index 6093a61fe3476a9661259911811a20f8610ce260..13e0fa7b76b9ebe7de0b422367a694a453bd118e 100644 (file)
@@ -1 +1 @@
-25b9f3b9b2d996ab4582b22b695c4dbd94d09cc7
\ No newline at end of file
+0d47653a3c39b7cd41c7e6edd8c4b4543658412d
\ No newline at end of file
index 9f2ff1b90509df103f9900df8cdc7b11785fee56..00ea04d0d76553581c7a9da9dc2603cf18ff26bc 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.439 2008/05/13 13:27:34 drh Exp $
+** $Id: main.c,v 1.440 2008/05/22 13:56:17 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -796,6 +796,7 @@ const char *sqlite3_errmsg(sqlite3 *db){
   sqlite3_mutex_enter(db->mutex);
   assert( !db->mallocFailed );
   z = (char*)sqlite3_value_text(db->pErr);
+  assert( !db->mallocFailed );
   if( z==0 ){
     z = sqlite3ErrStr(db->errCode);
   }
@@ -843,7 +844,12 @@ const void *sqlite3_errmsg16(sqlite3 *db){
          SQLITE_UTF8, SQLITE_STATIC);
     z = sqlite3_value_text16(db->pErr);
   }
-  sqlite3ApiExit(0, 0);
+  /* A malloc() may have failed within the call to sqlite3_value_text16()
+  ** above. If this is the case, then the db->mallocFailed flag needs to
+  ** be cleared before returning. Do this directly, instead of via
+  ** sqlite3ApiExit(), to avoid setting the database handle error message.
+  */
+  db->mallocFailed = 0;
   sqlite3_mutex_leave(db->mutex);
   return z;
 }
index b52667801b8d9fbaec0beb2b55c22c5f644264a9..6a72383c10962a97f59e857b4eeed9f856b837d8 100644 (file)
@@ -13,7 +13,7 @@
 ** interface, and routines that contribute to loading the database schema
 ** from disk.
 **
-** $Id: prepare.c,v 1.83 2008/04/03 14:36:26 danielk1977 Exp $
+** $Id: prepare.c,v 1.84 2008/05/22 13:56:17 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -545,7 +545,7 @@ static int sqlite3Prepare(
         const char *zDb = db->aDb[i].zName;
         sqlite3Error(db, SQLITE_LOCKED, "database schema is locked: %s", zDb);
         (void)sqlite3SafetyOff(db);
-        return SQLITE_LOCKED;
+        return sqlite3ApiExit(db, SQLITE_LOCKED);
       }
     }
   }
@@ -558,7 +558,7 @@ static int sqlite3Prepare(
     if( nBytes>mxLen ){
       sqlite3Error(db, SQLITE_TOOBIG, "statement too long");
       (void)sqlite3SafetyOff(db);
-      return SQLITE_TOOBIG;
+      return sqlite3ApiExit(db, SQLITE_TOOBIG);
     }
     zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes);
     if( zSqlCopy ){
index 4c6214a387d5a75d726bdb8602e8f73884e44799..1eaf21393604957cc9afe88250a2c6926955dab4 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.18 2008/01/18 17:03:33 drh Exp $
+# $Id: shared_err.test,v 1.19 2008/05/22 13:56:17 danielk1977 Exp $
 
 proc skip {args} {}
 
@@ -30,6 +30,7 @@ ifcapable !shared_cache||!subquery {
 
 set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
 
+
 do_ioerr_test shared_ioerr-1 -tclprep {
   sqlite3 db2 test.db
   execsql {
@@ -441,6 +442,7 @@ 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
@@ -463,6 +465,41 @@ do_malloc_test shared_err-9 -tclprep {
   db2 close
 }     
 
+catch {db close}
+catch {db2 close}
+do_malloc_test shared_err-10 -tclprep {
+  sqlite3 db test.db
+  sqlite3 db2 test.db
+  
+  db eval { SELECT * FROM sqlite_master }
+  db2 eval { 
+    BEGIN;
+    CREATE TABLE abc(a, b, c);
+  }
+} -tclbody {
+  catch {db eval {SELECT * FROM sqlite_master}}
+  error 1
+} -cleanup {
+  execsql { SELECT * FROM sqlite_master }
+}
+
+do_malloc_test shared_err-11 -tclprep {
+  sqlite3 db test.db
+  sqlite3 db2 test.db
+  
+  db eval { SELECT * FROM sqlite_master }
+  db2 eval { 
+    BEGIN;
+    CREATE TABLE abc(a, b, c);
+  }
+} -tclbody {
+  catch {db eval {SELECT * FROM sqlite_master}}
+  catch {sqlite3_errmsg16 db}
+  error 1
+} -cleanup {
+  execsql { SELECT * FROM sqlite_master }
+}
+
 
 catch {db close}
 catch {db2 close}