]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix memory leaks in WHERE clause processing and in TRIGGER parsing. (CVS 3775)
authordrh <drh@noemail.net>
Sat, 31 Mar 2007 01:34:44 +0000 (01:34 +0000)
committerdrh <drh@noemail.net>
Sat, 31 Mar 2007 01:34:44 +0000 (01:34 +0000)
FossilOrigin-Name: 6736f4547c0cc2123d1a19ed2d6915712718d22e

manifest
manifest.uuid
src/trigger.c
src/where.c

index 88943538742063893ea2a9efa144b4d2f27c4270..a4746fb972e9af81901d8f0376ec56cff22688ef 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\svestiges\sof\sSQLITE_PROTOCOL\sfrom\sthe\stest\sscripts.\s(CVS\s3774)
-D 2007-03-30T20:46:13
+C Fix\smemory\sleaks\sin\sWHERE\sclause\sprocessing\sand\sin\sTRIGGER\sparsing.\s(CVS\s3775)
+D 2007-03-31T01:34:45
 F Makefile.in 2f2c3bf69faf0ae7b8e8af4f94f1986849034530
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -118,7 +118,7 @@ F src/test_schema.c ced72140a3a25c148975428e170ec1850d3c3a7d
 F src/test_server.c a6460daed0b92ecbc2531b6dc73717470e7a648c
 F src/test_tclvar.c 315e77c17f128ff8c06b38c08617fd07c825a95b
 F src/tokenize.c bb1732ef2b6fc2143f93ff28a45d3dcb04c1d396
-F src/trigger.c 7f65762a7400031937774067a07cddc3f3c03e29
+F src/trigger.c b3c22b727049fceb96efa5f9f7d325fd853acc22
 F src/update.c 3359041db390a8f856d67272f299600e2104f350
 F src/utf.c 67ecb1032bc0b42c105e88d65ef9d9f626eb0e1f
 F src/util.c 8e8180ee5597f2474c1da311ff3c464b6966c0f1
@@ -131,7 +131,7 @@ F src/vdbeaux.c a77bf70260ac1802dccf1076088700cc51d81fa3
 F src/vdbefifo.c 3ca8049c561d5d67cbcb94dc909ae9bb68c0bf8f
 F src/vdbemem.c d3696b4b0e5f32272659816cdfa2348c650b1ba0
 F src/vtab.c 7fbda947e28cbe7adb3ba752a76ca9ef29936750
-F src/where.c 881cfd88a97dd9bdb366e5349a25a19ea89f40a1
+F src/where.c 25e0dbb96c6980d11cc756c2b4abdfda80cd67a5
 F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/all.test 60267b055e82de4fb8b841eabb014bc2f836a4eb
@@ -447,7 +447,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 6dfd4a12a8a03c204505e7a211e179b7dd47e4fb
-R cd89aee12e7576c3bbdb55074c8863c4
+P e5e8d56397acf041aeaf5361381eb22eb1554759
+R b77a60cf177b17327f9b7e624826632c
 U drh
-Z 436dad38c6888f4d3dbec8cb0d762646
+Z bf47571d4a3cac7d92437a7c798ec8c5
index 08523ba535fd6506a371dd29e805c809c1399eb7..5bd5f73039886695c3d09cd6611940db3013590a 100644 (file)
@@ -1 +1 @@
-e5e8d56397acf041aeaf5361381eb22eb1554759
\ No newline at end of file
+6736f4547c0cc2123d1a19ed2d6915712718d22e
\ No newline at end of file
index f410d9364dd280c431d1d8d4ccdb927fa1792822..f8c2bcd8c9fca46ea7ed559f3e504a33f5d6fe64 100644 (file)
@@ -413,7 +413,10 @@ TriggerStep *sqlite3TriggerUpdateStep(
 */
 TriggerStep *sqlite3TriggerDeleteStep(Token *pTableName, Expr *pWhere){
   TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep));
-  if( pTriggerStep==0 ) return 0;
+  if( pTriggerStep==0 ){
+    sqlite3ExprDelete(pWhere);
+    return 0;
+  }
 
   pTriggerStep->op = TK_DELETE;
   pTriggerStep->target  = *pTableName;
index 2377e767e0c0e9a81af7195ef4be08e8a5e0392c..b5a9581767b60c9293866beea59f953dcc766b98 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.244 2007/03/30 14:56:35 danielk1977 Exp $
+** $Id: where.c,v 1.245 2007/03/31 01:34:45 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -220,6 +220,9 @@ static void whereClauseClear(WhereClause *pWC){
 ** Add a new entries to the WhereClause structure.  Increase the allocated
 ** space as necessary.
 **
+** If the flags argument includes TERM_DYNAMIC, then responsibility
+** for freeing the expression p is assumed by the WhereClause object.
+**
 ** WARNING:  This routine might reallocate the space used to store
 ** WhereTerms.  All pointers to WhereTerms should be invalided after
 ** calling this routine.  Such pointers may be reinitialized by referencing
@@ -231,7 +234,12 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, int flags){
   if( pWC->nTerm>=pWC->nSlot ){
     WhereTerm *pOld = pWC->a;
     pWC->a = sqliteMalloc( sizeof(pWC->a[0])*pWC->nSlot*2 );
-    if( pWC->a==0 ) return 0;
+    if( pWC->a==0 ){
+      if( flags & TERM_DYNAMIC ){
+        sqlite3ExprDelete(p);
+      }
+      return 0;
+    }
     memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm);
     if( pOld!=pWC->aStatic ){
       sqliteFree(pOld);
@@ -734,7 +742,7 @@ static void exprAnalyze(
         int idxNew;
         pDup = sqlite3ExprDup(pExpr);
         if( sqlite3MallocFailed() ){
-          sqliteFree(pDup);
+          sqlite3ExprDelete(pDup);
           return;
         }
         idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);