mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
This is an alternative approach to the use-after-free problem fixed
by [193b14a58e378ab3], saved here for historical reference. FossilOrigin-Name: 6796b7a2485eca279db9d777595a886bc0d1dd7ec9551e1797e0032ef5493559
This commit is contained in:
22
src/select.c
22
src/select.c
@@ -5093,21 +5093,29 @@ static struct Cte *searchWith(
|
||||
** be freed along with the Parse object. In other cases, when
|
||||
** bFree==0, the With object will be freed along with the SELECT
|
||||
** statement with which it is associated.
|
||||
**
|
||||
** This routine returns a copy of pWith. Or, if bFree is true and
|
||||
** the pWith object is destroyed immediately due to an OOM condition,
|
||||
** then this routine return NULL.
|
||||
**
|
||||
** If bFree is true, do not continue to use the pWith pointer after
|
||||
** calling this routine, Instead, use only the return value.
|
||||
*/
|
||||
void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){
|
||||
With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){
|
||||
if( pWith ){
|
||||
if( bFree ){
|
||||
pWith = (With*)sqlite3ParserAddCleanup(pParse,
|
||||
(void(*)(sqlite3*,void*))sqlite3WithDelete,
|
||||
pWith);
|
||||
if( pWith==0 ) return 0;
|
||||
}
|
||||
if( pParse->nErr==0 ){
|
||||
assert( pParse->pWith!=pWith );
|
||||
pWith->pOuter = pParse->pWith;
|
||||
pParse->pWith = pWith;
|
||||
}
|
||||
if( bFree ){
|
||||
sqlite3ParserAddCleanup(pParse,
|
||||
(void(*)(sqlite3*,void*))sqlite3WithDelete,
|
||||
pWith);
|
||||
testcase( pParse->earlyCleanup );
|
||||
}
|
||||
}
|
||||
return pWith;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user