diff options
author | drh <drh@noemail.net> | 2002-05-23 02:09:03 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2002-05-23 02:09:03 +0000 |
commit | e4697f5e9031c0cb5a06a6bb4b0c8cb39a26ce7f (patch) | |
tree | b20799197f30858b9cfb2acdea2d43668de3dccb /src/trigger.c | |
parent | 1873cd508af1388cc536159aaa70a2ea83732bbd (diff) | |
download | sqlite-e4697f5e9031c0cb5a06a6bb4b0c8cb39a26ce7f.tar.gz sqlite-e4697f5e9031c0cb5a06a6bb4b0c8cb39a26ce7f.zip |
Fix some places where a malloc() failure would lead to a segfault. (CVS 580)
FossilOrigin-Name: 01ad352c3c82a86d9c94010cbc85d098b8fbc08a
Diffstat (limited to 'src/trigger.c')
-rw-r--r-- | src/trigger.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/trigger.c b/src/trigger.c index 5864b7d8c..81a750686 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -52,6 +52,7 @@ void sqliteCreateTrigger( } { char *tmp_str = sqliteStrNDup(pTableName->z, pTableName->n); + if( tmp_str==0 ) goto trigger_cleanup; tab = sqliteFindTable(pParse->db, tmp_str); sqliteFree(tmp_str); if( !tab ){ @@ -70,8 +71,11 @@ void sqliteCreateTrigger( /* Build the Trigger object */ nt = (Trigger*)sqliteMalloc(sizeof(Trigger)); + if( nt==0 ) goto trigger_cleanup; nt->name = sqliteStrNDup(pName->z, pName->n); nt->table = sqliteStrNDup(pTableName->z, pTableName->n); + nt->strings = sqliteStrNDup(zData, zDataLen); + if( sqlite_malloc_failed ) goto trigger_cleanup; nt->op = op; nt->tr_tm = tr_tm; nt->pWhen = pWhen; @@ -79,10 +83,7 @@ void sqliteCreateTrigger( nt->foreach = foreach; nt->step_list = pStepList; nt->isCommit = 0; - - nt->strings = sqliteStrNDup(zData, zDataLen); offset = (int)(nt->strings - zData); - sqliteExprMoveStrings(nt->pWhen, offset); ss = nt->step_list; @@ -120,6 +121,7 @@ void sqliteCreateTrigger( /* Make an entry in the sqlite_master table */ v = sqliteGetVdbe(pParse); + if( v==0 ) goto trigger_cleanup; sqliteBeginWriteOperation(pParse, 0); addr = sqliteVdbeAddOpList(v, ArraySize(insertTrig), insertTrig); sqliteVdbeChangeP3(v, addr+3, nt->name, 0); @@ -175,6 +177,7 @@ trigger_cleanup: */ TriggerStep *sqliteTriggerSelectStep(Select *pSelect){ TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; pTriggerStep->op = TK_SELECT; pTriggerStep->pSelect = pSelect; @@ -198,6 +201,7 @@ TriggerStep *sqliteTriggerInsertStep( 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); @@ -224,6 +228,7 @@ TriggerStep *sqliteTriggerUpdateStep( int orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ ){ TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; pTriggerStep->op = TK_UPDATE; pTriggerStep->target = *pTableName; @@ -240,7 +245,8 @@ TriggerStep *sqliteTriggerUpdateStep( ** sees a DELETE statement inside the body of a CREATE TRIGGER. */ TriggerStep *sqliteTriggerDeleteStep(Token *pTableName, Expr *pWhere){ - TriggerStep * pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + TriggerStep *pTriggerStep = sqliteMalloc(sizeof(TriggerStep)); + if( pTriggerStep==0 ) return 0; pTriggerStep->op = TK_DELETE; pTriggerStep->target = *pTableName; @@ -563,7 +569,7 @@ int sqliteCodeRowTrigger( } } - if( fire_this ){ + if( fire_this && (pTriggerStack = sqliteMalloc(sizeof(TriggerStack)))!=0 ){ int endTrigger; IdList dummyTablist; Expr * whenExpr; @@ -572,7 +578,6 @@ int sqliteCodeRowTrigger( dummyTablist.a = 0; /* Push an entry on to the trigger stack */ - pTriggerStack = sqliteMalloc(sizeof(TriggerStack)); pTriggerStack->pTrigger = pTrigger; pTriggerStack->newIdx = newIdx; pTriggerStack->oldIdx = oldIdx; |