]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems in the handling of malloc failures. (CVS 1882)
authordrh <drh@noemail.net>
Sun, 8 Aug 2004 23:39:19 +0000 (23:39 +0000)
committerdrh <drh@noemail.net>
Sun, 8 Aug 2004 23:39:19 +0000 (23:39 +0000)
FossilOrigin-Name: 81d91d14cf2352fc7981b361ac9af99b3cbbc9e8

manifest
manifest.uuid
src/build.c
src/expr.c
src/legacy.c
src/tokenize.c
src/utf.c
src/vdbe.c
src/vdbemem.c

index b808c9b4332e6c1cdc63395ce001d666b8170a4f..10171678c952b9d10d9adfc49f36e52a7e7461fa 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\ssure\sthe\sargument\sto\sctype.h\smacros\sis\salways\san\sunsigned\scharacter.\nTicket\s#839.\s(CVS\s1881)
-D 2004-08-08T20:22:17
+C Fix\sproblems\sin\sthe\shandling\sof\smalloc\sfailures.\s(CVS\s1882)
+D 2004-08-08T23:39:19
 F Makefile.in 4a5e570a9e2d35b09c31b3cf01b78cea764ade4b
 F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
@@ -29,16 +29,16 @@ F src/attach.c 0bd4f11da6999665da30625665a4096ba7898de6
 F src/auth.c 60db23b98bb94c8b0178180faaf49dc116674217
 F src/btree.c cfa5ed01838247be40c113cac528286675940801
 F src/btree.h 94dfec0a1722d33359b23e7e310f2b64ffedf029
-F src/build.c b6689d0c3b01d8552fb6dcd3b071be0b4194ca69
+F src/build.c 951a36b246d9f38f2340562bfdd6a96bf7433530
 F src/date.c a164e3a58f61306e82c5626e5fa16f861a9a7084
 F src/delete.c e81545e546f6bc87d7508a93a09ca70695265af3
 F src/encode.c a876af473d1d636faa3dca51c7571f2e007eea37
-F src/expr.c f4a883c00ff3fea1aa2bae4694c3b3984dcf6757
+F src/expr.c f11a1e5c489bc8f5cc83b10aa80f21e85f48141e
 F src/func.c 7e2eeebe219aa612ce7a04c74ae6d57379c6656b
 F src/hash.c f0a2f22c2a7052d67053b5f4690ea3010bb3fb9f
 F src/hash.h 762d95f1e567664d1eafc1687de755626be962fb
 F src/insert.c bedcba371401395033a1a1c578d8fdc3fec87bec
-F src/legacy.c 09b45fd3104da3175684d445f9be4e3c3a50c763
+F src/legacy.c 2f3617c61bcdcd1d776154a9cfebf99facda8ad8
 F src/main.c 41da595846e299b757cc413d18de804f97f68748
 F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070
 F src/os.h d1780e0db95cad01f213d48da22ab490eb4fd345
@@ -68,18 +68,18 @@ F src/test2.c f4c2f3928f1998fd8cb75a81e33a60e025ea85d4
 F src/test3.c 94d0a2a90bccd85802488cb42c69ec8afd2e4646
 F src/test4.c c38766914e924091516030b6a8b677d849c08bf0
 F src/test5.c b001fa7f1b9e2dc5c2331de62fc641b5ab2bd7a1
-F src/tokenize.c bc7a80e4cf54f42ea4b030c62261c4243133af84
+F src/tokenize.c 174d24d24129206be4923582189d772a70e2634c
 F src/trigger.c 360cf8f12edd4eb3a8a2895b136aac238c3cf44e
 F src/update.c b66b1896c9da54678ba3eff2bf0b4d291a95986a
-F src/utf.c f03535db72bfa09e24202ccdd245f21d2fc65f0a
+F src/utf.c 3d8f7bffcbefcced69a436c9e0a1c7eb9e0bb4fa
 F src/util.c c1d903777e6d2e647d1c898db37d15fe3a1cc172
 F src/vacuum.c 9978a5760c2c430bc5b5e66505a02dad76f25813
-F src/vdbe.c 6eb69df6de99f69efcb2b50a914ebbb5cad867de
+F src/vdbe.c 281af7f601a3220e86be2152eeb2ec6d82a6f71a
 F src/vdbe.h 75b241c02431b9c0f16eaa9cdbb34146c6287f52
 F src/vdbeInt.h 3d8e08c54dcb5ca2169db8bb3a37b81a12efaecd
 F src/vdbeapi.c 3be4ccab4ba6c21d60feffc48e22cf8c1643c6d5
 F src/vdbeaux.c 892a49f7bf8c46222108d6a9ba081ac578375744
-F src/vdbemem.c d4fa40d0dc1906e6c246092c990077da373e2b26
+F src/vdbemem.c 68fefaf83adb48fe44135da01502c9327f6172b0
 F src/where.c cf8a54641eea01f1af5d09529ad69166db92f658
 F test/all.test 3b692eb43583b52c99c344b2fa8934512d179016
 F test/attach.test 8fd75d2939528e1ae2a5030dfe738cd7fa8520eb
@@ -242,7 +242,7 @@ F www/tclsqlite.tcl 06a86cba4d7fc88e2bcd633b57702d3d16abebb5
 F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9
 F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P fc879a9b1d05ddb8f8c552c1d334597e41b29b27
-R ceec00facf1ec0be155668de66e15a7f
+P b065973898c06a81c69b70b3fa91c79334bd9b9a
+R 0b02700d4a6d7dfba8a8c6401c0a506f
 U drh
-Z 81e48ab08dabe4361601dbea6019899e
+Z f08c63eee1429bf392e3830a7cc69c02
index a9ff155d665a52328bba2b1e41b1d93da795ea03..4f1942987f2cfb4768c2069ae6fd7c48750c9ac2 100644 (file)
@@ -1 +1 @@
-b065973898c06a81c69b70b3fa91c79334bd9b9a
\ No newline at end of file
+81d91d14cf2352fc7981b361ac9af99b3cbbc9e8
\ No newline at end of file
index 4106ba0e49391bc9ac3fd9f589c955283169bad2..764169df47e9d644b6cbfd0ea899d98dc1bc5f18 100644 (file)
@@ -23,7 +23,7 @@
 **     ROLLBACK
 **     PRAGMA
 **
-** $Id: build.c,v 1.245 2004/08/08 20:22:17 drh Exp $
+** $Id: build.c,v 1.246 2004/08/08 23:39:19 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -80,11 +80,16 @@ void sqlite3FinishCoding(Parse *pParse){
       }
       sqlite3VdbeAddOp(v, OP_Goto, 0, pParse->cookieGoto);
     }
-  }
 
 #ifndef NDEBUG
-  sqlite3VdbeOp3(v, OP_Noop, 0, 0, pParse->zSql, pParse->zTail - pParse->zSql);
+    /* Add a No-op that contains the complete text of the compiled SQL
+    ** statement as its P3 argument.  This does not change the functionality
+    ** of the program.  But it does make it easier to debug.
+    */
+    sqlite3VdbeOp3(v, OP_Noop, 0, 0, pParse->zSql, pParse->zTail-pParse->zSql);
 #endif
+  }
+
 
   /* Get the VDBE program ready for execution
   */
index a01ab8aa35f5f8980a95813f1764908793eca849..a777874803e96fe851d78acf6a10804b015f7313 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains routines used for analyzing expressions and
 ** for generating VDBE code that evaluates expressions in SQLite.
 **
-** $Id: expr.c,v 1.154 2004/08/08 20:22:17 drh Exp $
+** $Id: expr.c,v 1.155 2004/08/08 23:39:19 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -226,8 +226,7 @@ Expr *sqlite3Expr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
 void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
   assert( pRight!=0 );
   assert( pLeft!=0 );
-  /* Note: pExpr might be NULL due to a prior malloc failure */
-  if( pExpr && pRight->z && pLeft->z ){
+  if( !sqlite3_malloc_failed && pRight->z && pLeft->z ){
     if( pLeft->dyn==0 && pRight->dyn==0 ){
       pExpr->span.z = pLeft->z;
       pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
index 58b18504fe57c101bf032ba87ad398e748183330..c5ffe70a62a2013924d80dfc7805bd04037f4f38 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: legacy.c,v 1.4 2004/08/08 20:22:18 drh Exp $
+** $Id: legacy.c,v 1.5 2004/08/08 23:39:19 drh Exp $
 */
 
 #include "sqliteInt.h"
@@ -122,6 +122,9 @@ exec_out:
   if( pStmt ) sqlite3_finalize(pStmt);
   if( azCols ) sqliteFree(azCols);
 
+  if( sqlite3_malloc_failed ){
+    rc = SQLITE_NOMEM;
+  }
   if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg ){
     *pzErrMsg = malloc(1+strlen(sqlite3_errmsg(db)));
     if( *pzErrMsg ){
index 97216215d0d983b6cdebb32747f2c7e637d24c0a..401e7125f857a611b67854c5d86604ab4a169417 100644 (file)
@@ -15,7 +15,7 @@
 ** individual tokens and sends those tokens one-by-one over to the
 ** parser for analysis.
 **
-** $Id: tokenize.c,v 1.80 2004/07/24 14:35:59 drh Exp $
+** $Id: tokenize.c,v 1.81 2004/08/08 23:39:19 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -478,6 +478,9 @@ abort_parse:
     sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);
   }
   sqlite3ParserFree(pEngine, free);
+  if( sqlite3_malloc_failed ){
+    pParse->rc = SQLITE_NOMEM;
+  }
   if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){
     sqlite3SetString(&pParse->zErrMsg, sqlite3ErrStr(pParse->rc),
                     (char*)0);
index 5fc37b5b5866f35cd7aead3ef8937f67bf88939c..563df634781f934e28f3629e7b0a4a712a003b65 100644 (file)
--- a/src/utf.c
+++ b/src/utf.c
@@ -12,7 +12,7 @@
 ** This file contains routines used to translate between UTF-8, 
 ** UTF-16, UTF-16BE, and UTF-16LE.
 **
-** $Id: utf.c,v 1.26 2004/06/28 13:09:11 danielk1977 Exp $
+** $Id: utf.c,v 1.27 2004/08/08 23:39:19 drh Exp $
 **
 ** Notes on UTF-8:
 **
@@ -281,7 +281,12 @@ int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
   */
   if( pMem->enc!=SQLITE_UTF8 && desiredEnc!=SQLITE_UTF8 ){
     u8 temp;
-    sqlite3VdbeMemMakeWriteable(pMem);
+    int rc;
+    rc = sqlite3VdbeMemMakeWriteable(pMem);
+    if( rc!=SQLITE_OK ){
+      assert( rc==SQLITE_NOMEM );
+      return SQLITE_NOMEM;
+    }
     zIn = pMem->z;
     zTerm = &zIn[pMem->n];
     while( zIn<zTerm ){
index 3c4391db3af76e9140ac4a55766f0f1cc89a4daf..12c8eadfcefe9b99a61bf9bcb5e5ef8a2ab4aab7 100644 (file)
@@ -43,7 +43,7 @@
 ** in this file for details.  If in doubt, do not deviate from existing
 ** commenting and indentation practices when changing or adding code.
 **
-** $Id: vdbe.c,v 1.407 2004/08/07 23:54:48 drh Exp $
+** $Id: vdbe.c,v 1.408 2004/08/08 23:39:19 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -1956,7 +1956,9 @@ case OP_Column: {
     zData = sMem.z;
   }
   sqlite3VdbeSerialGet(zData, aType[p2], pTos);
-  sqlite3VdbeMemMakeWriteable(pTos);
+  if( sqlite3VdbeMemMakeWriteable(pTos)==SQLITE_NOMEM ){
+    goto no_mem;
+  }
   pTos->enc = db->enc;
   if( rc!=SQLITE_OK ){
     goto abort_due_to_error;
@@ -3749,6 +3751,7 @@ case OP_ParseSchema: {
   zSql = sqlite3MPrintf(
      "SELECT name, rootpage, sql, %d FROM '%q'.%s WHERE %s",
      pOp->p1, db->aDb[iDb].zName, zMaster, pOp->p3);
+  if( zSql==0 ) goto no_mem;
   sqlite3SafetyOff(db);
   assert( db->init.busy==0 );
   db->init.busy = 1;
index 437c2dbd0b7478a874ccd9d85ab2fef89fcd1e57..b842fc775d8061c011bb11388596cf4097b36b53 100644 (file)
@@ -302,15 +302,18 @@ void sqlite3VdbeMemSetDouble(Mem *pMem, double val){
 ** Copy the contents of memory cell pFrom into pTo.
 */
 int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
+  int rc;
   sqlite3VdbeMemRelease(pTo);
   memcpy(pTo, pFrom, sizeof(*pFrom)-sizeof(pFrom->zShort));
   pTo->xDel = 0;
   if( pTo->flags & (MEM_Str|MEM_Blob) ){
     pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Short);
     pTo->flags |= MEM_Ephem;
-    sqlite3VdbeMemMakeWriteable(pTo);
+    rc = sqlite3VdbeMemMakeWriteable(pTo);
+  }else{
+    rc = SQLITE_OK;
   }
-  return SQLITE_OK;
+  return rc;
 }
 
 /*