diff options
author | danielk1977 <danielk1977@noemail.net> | 2005-03-16 12:15:20 +0000 |
---|---|---|
committer | danielk1977 <danielk1977@noemail.net> | 2005-03-16 12:15:20 +0000 |
commit | d5d565235b23ee3827515ddce486735322fc5857 (patch) | |
tree | 8ad88f3dd36acbd9edc76ad34b5292014ec34654 /src/trigger.c | |
parent | 165ffe9708d95c2c81206f526cb8b1fd4ab787f1 (diff) | |
download | sqlite-d5d565235b23ee3827515ddce486735322fc5857.tar.gz sqlite-d5d565235b23ee3827515ddce486735322fc5857.zip |
Fix some memory leaks that can occur if a memory allocation fails. (CVS 2388)
FossilOrigin-Name: 9a358fc33d726d0b5782bf65b50f61f2bd096d56
Diffstat (limited to 'src/trigger.c')
-rw-r--r-- | src/trigger.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/src/trigger.c b/src/trigger.c index eccc810e9..cdae012ea 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -51,7 +51,7 @@ void sqlite3BeginTrigger( Expr *pWhen, /* WHEN clause */ int isTemp /* True if the TEMPORARY keyword is present */ ){ - Trigger *pTrigger; + Trigger *pTrigger = 0; Table *pTab; char *zName = 0; /* Name of the trigger */ sqlite3 *db = pParse->db; @@ -161,7 +161,6 @@ void sqlite3BeginTrigger( pTrigger->name = zName; zName = 0; pTrigger->table = sqliteStrDup(pTableName->a[0].zName); - if( sqlite3_malloc_failed ) goto trigger_cleanup; pTrigger->iDb = iDb; pTrigger->iTabDb = pTab->iDb; pTrigger->op = op; @@ -178,6 +177,11 @@ trigger_cleanup: sqlite3SrcListDelete(pTableName); sqlite3IdListDelete(pColumns); sqlite3ExprDelete(pWhen); + if( !pParse->pNewTrigger ){ + sqlite3DeleteTrigger(pTrigger); + }else{ + assert( pParse->pNewTrigger==pTrigger ); + } } /* @@ -242,8 +246,13 @@ void sqlite3FinishTrigger( if( db->init.busy ){ Table *pTab; - sqlite3HashInsert(&db->aDb[pTrig->iDb].trigHash, + Trigger *pDel; + pDel = sqlite3HashInsert(&db->aDb[pTrig->iDb].trigHash, pTrig->name, strlen(pTrig->name)+1, pTrig); + if( pDel ){ + assert( sqlite3_malloc_failed && pDel==pTrig ); + goto triggerfinish_cleanup; + } pTab = sqlite3LocateTable(pParse,pTrig->table,db->aDb[pTrig->iTabDb].zName); assert( pTab!=0 ); pTrig->pNext = pTab->pTrigger; @@ -328,18 +337,23 @@ TriggerStep *sqlite3TriggerInsertStep( int orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ ){ TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); - if( pTriggerStep==0 ) return 0; assert(pEList == 0 || pSelect == 0); assert(pEList != 0 || pSelect != 0); - pTriggerStep->op = TK_INSERT; - pTriggerStep->pSelect = pSelect; - pTriggerStep->target = *pTableName; - pTriggerStep->pIdList = pColumn; - pTriggerStep->pExprList = pEList; - pTriggerStep->orconf = orconf; - sqlitePersistTriggerStep(pTriggerStep); + if( pTriggerStep ){ + pTriggerStep->op = TK_INSERT; + pTriggerStep->pSelect = pSelect; + pTriggerStep->target = *pTableName; + pTriggerStep->pIdList = pColumn; + pTriggerStep->pExprList = pEList; + pTriggerStep->orconf = orconf; + sqlitePersistTriggerStep(pTriggerStep); + }else{ + sqlite3IdListDelete(pColumn); + sqlite3ExprListDelete(pEList); + sqlite3SelectDup(pSelect); + } return pTriggerStep; } |