From: drh Date: Tue, 11 Nov 2008 00:21:30 +0000 (+0000) Subject: When an OOM error occurs while resizing an sqlite_value object, make sure X-Git-Tag: version-3.6.10~300 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=753cc1077bd7cdc9334068c5aca200cc524126cb;p=thirdparty%2Fsqlite.git When an OOM error occurs while resizing an sqlite_value object, make sure the value of the object is set to NULL. Ticket #3488. (CVS 5877) FossilOrigin-Name: 7b9c9b35fffb233e76148182426199d51243fba7 --- diff --git a/manifest b/manifest index 9ce5a92e5e..beb1130dcc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sdocumentation\sof\sthe\sSQLITE_FUNCTION\sauthorizer\scode\sso\sthat\sit\nagrees\swith\show\sSQLite\shas\salways\sbehaved.\s\sTicket\s#3489.\s(CVS\s5876) -D 2008-11-10T23:54:06 +C When\san\sOOM\serror\soccurs\swhile\sresizing\san\ssqlite_value\sobject,\smake\ssure\nthe\svalue\sof\sthe\sobject\sis\sset\sto\sNULL.\s\sTicket\s#3488.\s(CVS\s5877) +D 2008-11-11T00:21:30 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 48172b58e444a9725ec482e0c022a564749acab4 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -197,7 +197,7 @@ F src/vdbeapi.c ea22e171704906632cd971668359b8c0c5053001 F src/vdbeaux.c 75258853624ec5fba72039f87397b3d88c586fa1 F src/vdbeblob.c b0dcebfafedcf9c0addc7901ad98f6f986c08935 F src/vdbefifo.c 20fda2a7c4c0bcee1b90eb7e545fefcdbf2e1de7 -F src/vdbemem.c ff746621ff0f695507ac9989fe3256ea8bee66ad +F src/vdbemem.c 223e03281855515e9474dbf66f157452093a77c2 F src/vtab.c 527c180e9c5fca417c9167d02af4b5039f892b4b F src/walker.c 488c2660e13224ff70c0c82761118efb547f8f0d F src/where.c 171c9b2583944f66484c8552daa85373ce9e949f @@ -428,7 +428,7 @@ F test/mallocF.test 2d5c590ebc2fc7f0dcebdf5aa8498b9aed69107e F test/mallocG.test 4584d0d8ddb8009f16ca0c8bab1fa37f6358efa2 F test/mallocH.test 79b65aed612c9b3ed2dcdaa727c85895fd1bfbdb F test/mallocI.test 6e24fe6444bd2999ccc81f984977b44c0d6e5591 -F test/mallocJ.test 110204e20eb8a9475d6df57d07d09c31d4542b07 +F test/mallocJ.test 9ed2275a7857fe1d5f5e1debc68dfdc285fc262f F test/malloc_common.tcl 984baeb6c6b185e798827d1187d426acc2bc4962 F test/manydb.test 8de36b8d33aab5ef295b11d9e95310aeded31af8 F test/memdb.test a67bda4ff90a38f2b19f6c7f95aa7289e051d893 @@ -654,7 +654,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e -P 239186804c7541abc512da33bba8f6fc7d24a374 -R ee6aa1a2f8d51d75cfc7bd7b3020fdfd +P 806b6ed202292e386ac3e51cebcfb67f3870cd2f +R d1d72399c4198836cc46e37f71d2e131 U drh -Z db4af086fc1384c13372fd47a63469cd +Z ffa9723504b4d99f03db9e73564e4aa9 diff --git a/manifest.uuid b/manifest.uuid index 352dc33055..bc8a5afab8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -806b6ed202292e386ac3e51cebcfb67f3870cd2f \ No newline at end of file +7b9c9b35fffb233e76148182426199d51243fba7 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index c4f72ede89..8d96e62df2 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -15,7 +15,7 @@ ** only within the VDBE. Interface routines refer to a Mem using the ** name sqlite_value ** -** $Id: vdbemem.c,v 1.125 2008/11/05 17:41:19 drh Exp $ +** $Id: vdbemem.c,v 1.126 2008/11/11 00:21:30 drh Exp $ */ #include "sqliteInt.h" #include @@ -86,9 +86,6 @@ int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){ if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)z==pMem->zMalloc ){ pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); - if( !pMem->z ){ - pMem->flags = MEM_Null; - } preserve = 0; }else{ sqlite3DbFree(pMem->db, pMem->zMalloc); @@ -104,7 +101,11 @@ int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){ } pMem->z = pMem->zMalloc; - pMem->flags &= ~(MEM_Ephem|MEM_Static); + if( pMem->z==0 ){ + pMem->flags = MEM_Null; + }else{ + pMem->flags &= ~(MEM_Ephem|MEM_Static); + } pMem->xDel = 0; return (pMem->z ? SQLITE_OK : SQLITE_NOMEM); } diff --git a/test/mallocJ.test b/test/mallocJ.test index 58f5b2b333..04b4c69f0f 100644 --- a/test/mallocJ.test +++ b/test/mallocJ.test @@ -12,7 +12,7 @@ # This test script checks malloc failures in LIMIT operations for # UPDATE/DELETE statements. # -# $Id: mallocJ.test,v 1.3 2008/11/04 14:25:06 drh Exp $ +# $Id: mallocJ.test,v 1.4 2008/11/11 00:21:30 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -39,9 +39,10 @@ ifcapable {update_delete_limit} { } # ticket #3467 -do_malloc_test mallocJ-2 -sqlprep { +do_malloc_test mallocJ-2 -start 114 -sqlprep { CREATE TABLE t1(a,b); INSERT INTO t1 VALUES(1,2); + PRAGMA vdbe_trace=ON; } -sqlbody { SELECT a, b, 'abc' FROM t1 UNION