diff --git a/manifest b/manifest index 2ea5351ff6..9d9769f38d 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 6093a61fe3..13e0fa7b76 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25b9f3b9b2d996ab4582b22b695c4dbd94d09cc7 \ No newline at end of file +0d47653a3c39b7cd41c7e6edd8c4b4543658412d \ No newline at end of file diff --git a/src/main.c b/src/main.c index 9f2ff1b905..00ea04d0d7 100644 --- a/src/main.c +++ b/src/main.c @@ -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 @@ -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; } diff --git a/src/prepare.c b/src/prepare.c index b52667801b..6a72383c10 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -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 @@ -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 ){ diff --git a/test/shared_err.test b/test/shared_err.test index 4c6214a387..1eaf213936 100644 --- a/test/shared_err.test +++ b/test/shared_err.test @@ -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}