]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add some tests for malloc() failure within the column_name() and column_decl() APIs...
authordanielk1977 <danielk1977@noemail.net>
Wed, 7 Dec 2005 06:27:43 +0000 (06:27 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Wed, 7 Dec 2005 06:27:43 +0000 (06:27 +0000)
FossilOrigin-Name: 78f10ca0a6a02e9e8e6811489841a19e213f3afb

manifest
manifest.uuid
src/tclsqlite.c
src/vdbeapi.c
src/vdbemem.c
src/where.c
test/malloc3.test
test/malloc4.test [new file with mode: 0644]
test/quick.test

index b33dbc8d5530863283ac076516c42294de6a2703..cfb8ccc3d40dd762fd0ef8aa02d62c48049a1387 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Allow\sVACUUM\sto\sdetach\sthe\sauxillary\sdatabase\safter\smalloc()\sfails.\s(CVS\s2804)
-D 2005-12-06T17:48:32
+C Add\ssome\stests\sfor\smalloc()\sfailure\swithin\sthe\scolumn_name()\sand\scolumn_decl()\sAPIs.\s(CVS\s2805)
+D 2005-12-07T06:27:44
 F Makefile.in e3c6b3a38d734d41574c04f2fc90d18de2b87102
 F Makefile.linux-gcc aee18d8a05546dcf1888bd4547e442008a49a092
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -71,7 +71,7 @@ F src/shell.c 3596c1e559b82663057940d19ba533ad421c7dd3
 F src/sqlite.h.in 8e648e1f386e4509f2f96c09ded7c07b0df0c9a2
 F src/sqliteInt.h bbc310a83a32476aa960055a166af4a0ef503a79
 F src/table.c 486dcfce532685b53b5a2b5da8bba0ded6fb2316
-F src/tclsqlite.c a497c3adfd2c85da6a934331ec0041e47884fbcb
+F src/tclsqlite.c 328060916c24d328cfab1622c9a0e7ad57c2da8c
 F src/test1.c 0b4bf8ab9afb37f34a83c46f81de54adf519b23d
 F src/test2.c 36390cdfc70c08e5ee0b466d0654a117f398bbff
 F src/test3.c f4e6a16a602091696619a1171bda25c0e3df49f7
@@ -87,11 +87,11 @@ F src/vacuum.c 4d64ce98a4cb130002cbf8aba018b2567773e6b1
 F src/vdbe.c 7f4a2affee140b7b57952ab2c081a9c22b950638
 F src/vdbe.h 8729a4ee16ff9aeab2af9667df3cf300ff978e13
 F src/vdbeInt.h 0055c37eccbf3a189fd893a90f8eb6a5fa60c871
-F src/vdbeapi.c 4fd33e87aa6cbd77e59da142e1df67ec0430225f
+F src/vdbeapi.c b80b3a1e8bf7866d96ca76d91bba979155bace57
 F src/vdbeaux.c 90143aaffbe232a700fd05e4b2e7428d512b605b
 F src/vdbefifo.c 9efb94c8c3f4c979ebd0028219483f88e57584f5
-F src/vdbemem.c cd9609c1e7f71ec76d9840c84c3a57ebfa6539cf
-F src/where.c c0882f2d42e636f78fb45b9279e2739d4291e6ab
+F src/vdbemem.c 1c70555d615c6001c4490dedb6a62cb2884b92ff
+F src/where.c 269569f380ddc018518f67765fe2f0d3c8760e28
 F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
 F test/all.test 7f0988442ab811dfa41793b5b550f5828ce316f3
 F test/alter.test 9d6837a3d946b73df692b7cef2a7644d2e2f6bc6
@@ -179,7 +179,8 @@ F test/lock3.test 615111293cf32aa2ed16d01c6611737651c96fb9
 F test/main.test b12f01d49a5c805a33fa6c0ef168691f63056e79
 F test/malloc.test a5ed721cf7d1b12602ede4f98c11b65ab1582cc0
 F test/malloc2.test e6e321db96d6c94cb18bf82ad7215070c41e624e
-F test/malloc3.test 1c7eebb2cf0f1fb1fbcaa1d6b3f25767c55aa6c9
+F test/malloc3.test 0d60a9d19196581e9279c2d040bebd8162ab495b
+F test/malloc4.test 593ae91bf69ab5abc68f7652e679e5d207e23166
 F test/manydb.test d81debbf5871242e3b5df1d3bb5e14c50431b6f8
 F test/memdb.test 1860e060be810bf0775bc57408a5b7c4954bcaea
 F test/memleak.test df2b2b96e77f8ba159a332299535b1e5f18e49ac
@@ -199,7 +200,7 @@ F test/pagesize.test cbc6a312b6f6c0f02619b189985df2a14164b690
 F test/pragma.test 95ea907adf68459e1be6f310c9ae94d1d59c465b
 F test/printf.test 9e10c74e16bf889f8495ddb3d6f5f891e75ff1b7
 F test/progress.test 16496001da445e6534afb94562c286708316d82f x
-F test/quick.test a94d12658a2b590c1a5be580bef09bbb04c1266b
+F test/quick.test 84138c0fcc959a5e7761625aa52d37d55e56b748
 F test/quote.test 5891f2338980916cf7415484b4ce785294044adb
 F test/reindex.test 38b138abe36bf9a08c791ed44d9f76cd6b97b78b
 F test/rollback.test 94cd981ee3a627d9f6466f69dcf1f7dbfe695d7a
@@ -325,7 +326,7 @@ F www/tclsqlite.tcl ddcf912ea48695603c8ed7efb29f0812ef8d1b49
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 5e04ec694add7a8331e3d6fbdfcaed51349ae7bc
-R f7226b3a88877e57bdcf4f6eccd9d5fd
+P 6824a78bc7b8582fc5c3a6ab05dd3ed996fc99b3
+R 531cb0ab110be0b71cbe712b6392904d
 U danielk1977
-Z 48f4477e2bf6d1e22b59c59df71537c6
+Z 7e47f34607634a7d8a9c0da4aab29935
index 71d5c058f515d45f65580f36f530c6f16f2b518f..2965911a722dc25d0f22979a9a5c05ac4b6e842c 100644 (file)
@@ -1 +1 @@
-6824a78bc7b8582fc5c3a6ab05dd3ed996fc99b3
\ No newline at end of file
+78f10ca0a6a02e9e8e6811489841a19e213f3afb
\ No newline at end of file
index f928faab7ac3ea38b315d081ff9ded9c140ce09e..3f6d928035aa00a54214de6c70be4ce3bb322d47 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** A TCL Interface to SQLite
 **
-** $Id: tclsqlite.c,v 1.134 2005/11/26 00:25:03 drh Exp $
+** $Id: tclsqlite.c,v 1.135 2005/12/07 06:27:44 danielk1977 Exp $
 */
 #ifndef NO_TCL     /* Omit this whole file if TCL is unavailable */
 
@@ -402,7 +402,7 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){
         }
         default: {
           int bytes = sqlite3_value_bytes(pIn);
-          pVal = Tcl_NewStringObj(sqlite3_value_text(pIn), bytes);
+          pVal = Tcl_NewStringObj((char *)sqlite3_value_text(pIn), bytes);
           break;
         }
       }
@@ -449,8 +449,8 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){
       Tcl_GetWideIntFromObj(0, pVar, &v);
       sqlite3_result_int64(context, v);
     }else{
-      data = Tcl_GetStringFromObj(pVar, &n);
-      sqlite3_result_text(context, data, n, SQLITE_TRANSIENT);
+      data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
+      sqlite3_result_text(context, (char *)data, n, SQLITE_TRANSIENT);
     }
   }
 }
@@ -1285,8 +1285,8 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
               Tcl_GetWideIntFromObj(interp, pVar, &v);
               sqlite3_bind_int64(pStmt, i, v);
             }else{
-              data = Tcl_GetStringFromObj(pVar, &n);
-              sqlite3_bind_text(pStmt, i, data, n, SQLITE_STATIC);
+              data = (unsigned char *)Tcl_GetStringFromObj(pVar, &n);
+              sqlite3_bind_text(pStmt, i, (char *)data, n, SQLITE_STATIC);
               Tcl_IncrRefCount(pVar);
               apParm[nParm++] = pVar;
             }
@@ -1354,7 +1354,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
               break;
             }
             default: {
-              pVal = dbTextToObj(sqlite3_column_text(pStmt, i));
+              pVal = dbTextToObj((char *)sqlite3_column_text(pStmt, i));
               break;
             }
           }
index bc774b4f143cc8e0d14906f3f403d5d233995263..5d5e9cbb92038f227e25688d3d10b75950d92c4e 100644 (file)
@@ -58,7 +58,7 @@ sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
   return sqlite3VdbeIntValue((Mem*)pVal);
 }
 const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
-  return (const char *)sqlite3ValueText(pVal, SQLITE_UTF8);
+  return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
 }
 #ifndef SQLITE_OMIT_UTF16
 const void *sqlite3_value_text16(sqlite3_value* pVal){
@@ -439,6 +439,7 @@ static const void *columnName(
   const void *(*xFunc)(Mem*),
   int useType
 ){
+  const void *ret;
   Vdbe *p = (Vdbe *)pStmt;
   int n = sqlite3_column_count(pStmt);
 
@@ -446,7 +447,13 @@ static const void *columnName(
     return 0;
   }
   N += useType*n;
-  return xFunc(&p->aColName[N]);
+  ret = xFunc(&p->aColName[N]);
+
+  /* A malloc may have failed inside of the xFunc() call. If this is the case,
+  ** clear the mallocFailed flag and return NULL.
+  */
+  sqlite3ClearMallocFailed();
+  return ret;
 }
 
 
index 8ee2e2bd24f3f8ca50c0e6631a2d47c4fb13bcdf..31b0f3750a59647cefbae268c079926ef8de5d5d 100644 (file)
@@ -41,11 +41,21 @@ int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
 #ifdef SQLITE_OMIT_UTF16
   return SQLITE_ERROR;
 #else
+
+  /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned,
+  ** then the encoding of the value may not have changed.
+  */
   rc = sqlite3VdbeMemTranslate(pMem, desiredEnc);
+  assert(rc==SQLITE_OK    || rc==SQLITE_NOMEM);
+  assert(rc==SQLITE_OK    || pMem->enc!=desiredEnc);
+  assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc);
+
   if( rc==SQLITE_NOMEM ){
+/*
     sqlite3VdbeMemRelease(pMem);
     pMem->flags = MEM_Null;
     pMem->z = 0;
+*/
   }
   return rc;
 #endif
@@ -746,7 +756,8 @@ const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
   }else if( !(pVal->flags&MEM_Blob) ){
     sqlite3VdbeMemStringify(pVal, enc);
   }
-  return (const void *)(pVal->z);
+  assert(pVal->enc==enc || sqlite3Tsd()->mallocFailed);
+  return (const void *)(pVal->enc==enc ? (pVal->z) : 0);
 }
 
 /*
index d952d078feb054ef28379c71a1b2b1ff812b05fa..d643bde05ff3f847e18a9fd052f0925ab84dc6e9 100644 (file)
@@ -16,7 +16,7 @@
 ** so is applicable.  Because this module is responsible for selecting
 ** indices, you might also think of this module as the "query optimizer".
 **
-** $Id: where.c,v 1.186 2005/12/06 12:53:01 danielk1977 Exp $
+** $Id: where.c,v 1.187 2005/12/07 06:27:44 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -521,7 +521,7 @@ static int isLikeOrGlob(
     return 0;
   }
   sqlite3DequoteExpr(pRight);
-  z = pRight->token.z;
+  z = (char *)pRight->token.z;
   for(cnt=0; (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2]; cnt++){}
   if( cnt==0 || 255==(u8)z[cnt] ){
     return 0;
index 940fe9b0fcc2427b2222135296ff8eaa0b9ded9a..f1259cda1753822a4ecc44063be1815fa39b9876 100644 (file)
@@ -9,7 +9,11 @@
 #
 #***********************************************************************
 #
-# $Id: malloc3.test,v 1.2 2005/12/06 17:48:32 danielk1977 Exp $
+# This file contains tests to ensure that the library handles malloc() failures
+# correctly. The emphasis of these tests are the _prepare(), _step() and
+# _finalize() calls.
+#
+# $Id: malloc3.test,v 1.3 2005/12/07 06:27:45 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -453,7 +457,7 @@ TEST 29 {
   } {a b c a b c 1 2 3 1 2 3}
 }
 
-# Test a simple multi-file transaction
+# Test a simple multi-file transaction 
 #
 file delete -force test2.db
 SQL {ATTACH 'test2.db' AS aux;}
diff --git a/test/malloc4.test b/test/malloc4.test
new file mode 100644 (file)
index 0000000..eee0afc
--- /dev/null
@@ -0,0 +1,114 @@
+# 2005 November 30
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# This file contains tests to ensure that the library handles malloc() failures
+# correctly. The emphasis in this file is on sqlite3_column_XXX() APIs.
+#
+# $Id: malloc4.test,v 1.1 2005/12/07 06:27:45 danielk1977 Exp $
+
+#---------------------------------------------------------------------------
+# NOTES ON EXPECTED BEHAVIOUR
+#
+#---------------------------------------------------------------------------
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+# Only run these tests if memory debugging is turned on.
+if {[info command sqlite_malloc_stat]==""} {
+   puts "Skipping malloc tests: not compiled with -DSQLITE_MEMDEBUG..."
+   finish_test
+   return
+}
+
+
+proc do_stmt_test {id sql} {
+  set ::sql $sql
+  set go 1
+  for {set n 1} {$go} {incr n} {
+    set testid "malloc4-$id.(iFail $n)"
+
+    # Prepare the statement
+    do_test ${testid}.1 {
+      set ::STMT [sqlite3_prepare $::DB $sql -1 TAIL]
+      expr [string length $::STMT] > 0
+    } {1}
+
+    # Set the Nth malloc() to fail.
+    sqlite_malloc_fail $n
+
+    # Test malloc failure in the _name(), _name16(), decltype() and
+    # decltype16() APIs. Calls that occur after the malloc() failure should
+    # return NULL. No error is raised though.
+    do_test ${testid}.2.1 {
+      set mf1 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+      set ::name8  [sqlite3_column_name $::STMT 0]
+      set mf2 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+      expr {$mf1 == $mf2 || $::name8 == ""}
+    } {1}
+    do_test ${testid}.2.2 {
+      set mf1 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+      set ::name16 [sqlite3_column_name16 $::STMT 0]
+      set ::name16 [encoding convertfrom unicode $::name16]
+      set ::name16 [string range $::name16 0 end-1]
+      set mf2 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+      expr {$mf1 == $mf2 || $::name16 == ""}
+    } {1}
+    do_test ${testid}.2.3 {
+      set mf1 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+      set ::name8_2 [sqlite3_column_name $::STMT 0]
+      set mf2 [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+      expr {$mf1 == $mf2 || $::name8_2 == ""}
+    } {1}
+    set ::mallocFailed [expr [lindex [sqlite_malloc_stat] 2] <= 0]
+    do_test ${testid}.2.4 {
+      expr {
+        $::name8 == $::name8_2 && $::name16 == $::name8 && !$::mallocFailed ||
+        $::name8 == $::name8_2 && $::name16 == "" &&        $::mallocFailed ||
+        $::name8 == $::name16 && $::name8_2 == "" &&        $::mallocFailed ||
+        $::name8_2 == $::name16 && $::name8 == "" &&        $::mallocFailed
+      }
+    } {1}
+
+    if {$::mallocFailed == 0} {
+      sqlite_malloc_fail 0
+      set go 0
+    }
+
+if 0 {
+    # Test that if a malloc() failed the next call to sqlite3_step() returns
+    # SQLITE_ERROR. If malloc() did not fail, it should return SQLITE_ROW.
+    #
+    # Before running sqlite3_step(), make sure that malloc() is not about to
+    # fail. Memory allocation failures that occur within sqlite3_step() are
+    # tested elsewhere.
+    do_test ${testid}.3 {
+      set rc [sqlite3_step $::STMT]
+      list [expr $rc=="SQLITE_ERROR"] [expr $rc=="SQLITE_ROW"]
+    } [list $mallocFailed [expr !$mallocFailed]]
+}
+
+    do_test ${testid}.4 {
+      sqlite3_finalize $::STMT
+    } {SQLITE_OK}
+  }
+}
+
+execsql {
+  CREATE TABLE tbl(
+    the_first_reasonably_long_column_name that_also_has_quite_a_lengthy_type
+  );
+}
+do_stmt_test 1 "SELECT * FROM tbl"
+
+sqlite_malloc_fail 0
+finish_test
+
index 93db66bdbfef0321caf4b9f32f5b3a1e983ae260..61bfcb09e7088a8f4e5071494911c5e81ac8d1e8 100644 (file)
@@ -1,7 +1,3 @@
-# 2001 September 15
-#
-# The author disclaims copyright to this source code.  In place of
-# a legal notice, here is a blessing:
 #
 #    May you do good and not evil.
 #    May you find forgiveness for yourself and forgive others.
@@ -10,7 +6,7 @@
 #***********************************************************************
 # This file runs all tests.
 #
-# $Id: quick.test,v 1.36 2005/03/29 08:26:13 danielk1977 Exp $
+# $Id: quick.test,v 1.37 2005/12/07 06:27:45 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -29,6 +25,8 @@ set EXCLUDE {
   crash.test
   malloc.test
   malloc2.test
+  malloc3.test
+  malloc4.test
   memleak.test
   misuse.test
   quick.test