Fix some memory leaks and crashes that could follow an OOM condition during WITH clause parsing.

FossilOrigin-Name: 8839850c44a8938883e493eacd752fa686e542df
This commit is contained in:
dan 2014-01-13 16:36:40 +00:00
parent 4e9119d9e8
commit a9f5c13d0c
5 changed files with 36 additions and 12 deletions

View File

@ -1,5 +1,5 @@
C Add\scode\sto\shandle\snon-recursive\sCTEs\sin\sthe\ssame\sway\sas\sSQL\sviews.
D 2014-01-13T15:12:23.149
C Fix\ssome\smemory\sleaks\sand\scrashes\sthat\scould\sfollow\san\sOOM\scondition\sduring\sWITH\sclause\sparsing.
D 2014-01-13T16:36:40.215
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -169,7 +169,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
F src/btree.c 11e29ef8cf16a42925fde036bcffbeffd9cc82df
F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9
F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0
F src/build.c 1efdc65020e1f566383b66b30ccf730b4ef6f926
F src/build.c 5a2daa6649640711ca60114046903be932348e52
F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd
@ -209,7 +209,7 @@ F src/os_unix.c 3a4dcb554d3c915075766162f28c3fd4cdb75968
F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07
F src/pager.c efa923693e958696eee69b205a20bfbc402c8480
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
F src/parse.y b433588d7993d6475d9944be0fda2fb3df3cb138
F src/parse.y e5c4a23f445cde4b30d50948df8f21bc586dd7a4
F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b
@ -1092,7 +1092,7 @@ F test/win32heap.test ea19770974795cff26e11575e12d422dbd16893c
F test/win32lock.test 7a6bd73a5dcdee39b5bb93e92395e1773a194361
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
F test/with1.test fb8409a35b1314be6e73a87597322f3369b59b2b
F test/withM.test 036349a9ec081fee8b1f72e71ad8a5a5b80f1674
F test/withM.test ac3ec7ee0b33a02d0fa15da91214d97ddea64e34
F test/without_rowid1.test aaa26da19d543cd8d3d2d0e686dfa255556c15c8
F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99
F test/without_rowid3.test eac3d5c8a1924725b58503a368f2cbd24fd6c8a0
@ -1150,7 +1150,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P 704d3931b855562a619769955969d439c42ca406
R fb5ad7a801e83802b92e3793bba4fd6c
P a26f399ba485e8127c276c5f103ec6c555e11734
R 7e06730d3714a8aceb489d831c2bc18d
U dan
Z 663a5542bd9dc2bb50ed6e3a07d040fb
Z 780f0749f7ee296248db4bd00ffb23e3

View File

@ -1 +1 @@
a26f399ba485e8127c276c5f103ec6c555e11734
8839850c44a8938883e493eacd752fa686e542df

View File

@ -4234,12 +4234,13 @@ With *sqlite3WithAdd(
pNew = sqlite3DbMallocZero(db, sizeof(*pWith));
}
assert( zName!=0 || pNew==0 );
assert( db->mallocFailed==0 || pNew==0 );
if( pNew==0 ){
sqlite3WithDelete(db, pWith);
sqlite3ExprListDelete(db, pArglist);
sqlite3SelectDelete(db, pQuery);
sqlite3DbFree(db, zName);
pNew = pWith;
}else{
pNew->a[pNew->nCte].pSelect = pQuery;
pNew->a[pNew->nCte].pCols = pArglist;

View File

@ -412,7 +412,14 @@ cmd ::= select(X). {
%type oneselect {Select*}
%destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
select(A) ::= with(W) selectnowith(X). { if( X ) X->pWith = W; A = X; }
select(A) ::= with(W) selectnowith(X). {
if( X ){
X->pWith = W;
}else{
sqlite3WithDelete(pParse->db, W);
}
A = X;
}
selectnowith(A) ::= oneselect(X). {A = X;}
%ifndef SQLITE_OMIT_COMPOUND_SELECT

View File

@ -22,7 +22,7 @@ do_execsql_test 1.0 {
INSERT INTO t1 VALUES(123, 456);
}
do_faultsim_test withM-1 -prep {
do_faultsim_test withM-1.1 -prep {
sqlite3 db test.db
} -body {
execsql {
@ -34,6 +34,22 @@ do_faultsim_test withM-1 -prep {
db close
}
do_faultsim_test withM-1.2 -prep {
sqlite3 db test.db
} -body {
execsql {
WITH w1 AS ( SELECT * FROM t1 ),
w2 AS (
WITH w3 AS ( SELECT * FROM w1 )
SELECT * FROM w3
)
SELECT * FROM w2;
}
} -test {
faultsim_test_result {0 {123 456}}
db close
}
finish_test