diff options
author | drh <drh@noemail.net> | 2009-11-16 22:54:50 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2009-11-16 22:54:50 +0000 |
commit | f6a82030a827fe6f60e7ff3221a53887c9162bf6 (patch) | |
tree | b6e8b578075a4b6e75f89cd0dbe65f57b3f3ebd8 /src | |
parent | 372726336b695fda5d177aaa63ac61f6ecb36a0c (diff) | |
download | sqlite-f6a82030a827fe6f60e7ff3221a53887c9162bf6.tar.gz sqlite-f6a82030a827fe6f60e7ff3221a53887c9162bf6.zip |
Fix a reference to freed memory that can occur following an OOM error in
where.c.
FossilOrigin-Name: 929b6047391411c6f539e47afe6b63d16e352ccb
Diffstat (limited to 'src')
-rw-r--r-- | src/where.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/src/where.c b/src/where.c index 90df4c495..84cbd4636 100644 --- a/src/where.c +++ b/src/where.c @@ -2594,15 +2594,13 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ ** Code an OP_Affinity opcode to apply the column affinity string zAff ** to the n registers starting at base. ** -** Buffer zAff was allocated using sqlite3DbMalloc(). It is the -** responsibility of this function to arrange for it to be eventually -** freed using sqlite3DbFree(). +** This routine assumes that zAff is dynamic and makes its own copy. */ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ Vdbe *v = pParse->pVdbe; assert( v!=0 ); sqlite3VdbeAddOp2(v, OP_Affinity, base, n); - sqlite3VdbeChangeP4(v, -1, zAff, P4_DYNAMIC); + sqlite3VdbeChangeP4(v, -1, zAff, 0); sqlite3ExprCacheAffinityChange(pParse, base, n); } @@ -3130,7 +3128,6 @@ static Bitmask codeOneLoopStart( sqlite3ExprCacheRemove(pParse, regBase+nEq); sqlite3ExprCode(pParse, pRight, regBase+nEq); sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - zAff = sqlite3DbStrDup(pParse->db, zAff); if( zAff && sqlite3CompareAffinity(pRight, zAff[nConstraint])==SQLITE_AFF_NONE ){ @@ -3142,6 +3139,7 @@ static Bitmask codeOneLoopStart( codeApplyAffinity(pParse, regBase, nEq+1, zAff); nConstraint++; } + sqlite3DbFree(pParse->db, zAff); /* Top of the loop body */ pLevel->p2 = sqlite3VdbeCurrentAddr(v); |