From: drh Date: Sat, 23 Jul 2016 00:43:14 +0000 (+0000) Subject: Fix sqlite3VdbeExpandSql() so that it handles OOMs by always returning NULL. X-Git-Tag: version-3.14.0~57^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cf1e395acb41d886d72aa77d7e49f08ed1d36317;p=thirdparty%2Fsqlite.git Fix sqlite3VdbeExpandSql() so that it handles OOMs by always returning NULL. FossilOrigin-Name: 5a027fe4127d498e0dc0d9439131c6a29085cf0a --- diff --git a/manifest b/manifest index cbb93bb180..a844004956 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Be\ssure\sto\shold\sthe\sdatabase\sconnection\smutex\swhile\scalling\ssqlite3VdbeExpand()\nfrom\swithin\ssqlite3_expanded_sql(). -D 2016-07-22T20:45:03.857 +C Fix\ssqlite3VdbeExpandSql()\sso\sthat\sit\shandles\sOOMs\sby\salways\sreturning\sNULL. +D 2016-07-23T00:43:14.540 F Makefile.in 6c20d44f72d4564f11652b26291a214c8367e5db F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a @@ -453,11 +453,11 @@ F src/vdbe.c 7b5570f77e32766949fd8f9478e4a9bb06e6ab24 F src/vdbe.h 67bc551f7faf04c33493892e4b378aada823ed10 F src/vdbeInt.h c59381049af5c7751a83456c39b80d1a6fde1f9d F src/vdbeapi.c 460b90f7f0894753d33df377702c1dc9cc5fa21b -F src/vdbeaux.c 7a09b945ebc4893e3a15bd68c4634d4aff34ebd5 +F src/vdbeaux.c 8557563e9b0fed6ba05b0ce42e3b3049d93f26fa F src/vdbeblob.c 83d2d266383157b02e2b809350bb197e89d7895b F src/vdbemem.c 1ecaa5ee0caff07255f25d04e8dc88befb6f88d1 F src/vdbesort.c 91fda3909326860382b0ca8aa251e609c6a9d62c -F src/vdbetrace.c d0371769fe66fe4eb85bdcacf82b6f2af50feb9b +F src/vdbetrace.c bea16fb07070b33f6efdece3169c3c4b423894a8 F src/vtab.c 948d2d4984219eee37a7bf427d6667e21e6eb92e F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 02eeecc265f6ffd0597378f5d8ae9070b62a406a @@ -1506,7 +1506,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 409535e6dfc307f26ea3d9f51be51c439b6d7b22 -R 2b4fbb49220ef1cdb35ff0cc787c0937 +P 527b5ba68c0b0185958b945b197f9022951d9379 +R e119b9614fe99fd5a44e65f51db3182b U drh -Z 1a401e59c5d6714d520ae3898a7c3c7e +Z 16700eecfd0a8ed6af44720c8587b7e0 diff --git a/manifest.uuid b/manifest.uuid index 8a31fb63f9..7d4379e1ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -527b5ba68c0b0185958b945b197f9022951d9379 \ No newline at end of file +5a027fe4127d498e0dc0d9439131c6a29085cf0a \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 6eeb325b1e..b04a1d23f2 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -85,12 +85,14 @@ char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ #ifdef SQLITE_OMIT_TRACE return 0; #else - Vdbe *p = (Vdbe *)pStmt; - char *z; - if( p==0 || p->zSql==0 ) return 0; - sqlite3_mutex_enter(p->db->mutex); - z = sqlite3VdbeExpandSql(p, p->zSql); - sqlite3_mutex_leave(p->db->mutex); + char *z = 0; + const char *zSql = sqlite3_sql(pStmt); + if( zSql ){ + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + z = sqlite3VdbeExpandSql(p, zSql); + sqlite3_mutex_leave(p->db->mutex); + } return z; #endif } diff --git a/src/vdbetrace.c b/src/vdbetrace.c index 7311bc35c6..8a1c23bc35 100644 --- a/src/vdbetrace.c +++ b/src/vdbetrace.c @@ -81,6 +81,9 @@ char *sqlite3VdbeExpandSql( int i; /* Loop counter */ Mem *pVar; /* Value of a host parameter */ StrAccum out; /* Accumulate the output here */ +#ifndef SQLITE_OMIT_UTF16 + Mem utf8; /* Used to convert UTF16 parameters into UTF8 for display */ +#endif char zBase[100]; /* Initial working space */ db = p->db; @@ -135,12 +138,16 @@ char *sqlite3VdbeExpandSql( int nOut; /* Number of bytes of the string text to include in output */ #ifndef SQLITE_OMIT_UTF16 u8 enc = ENC(db); - Mem utf8; if( enc!=SQLITE_UTF8 ){ memset(&utf8, 0, sizeof(utf8)); utf8.db = db; - sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC); - sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8); + if( SQLITE_NOMEM== sqlite3VdbeMemSetStr(&utf8,pVar->z,pVar->n,enc,SQLITE_STATIC) + || SQLITE_NOMEM== sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) + ){ + sqlite3StrAccumReset(&out); + sqlite3VdbeMemRelease(&utf8); + return 0; + } pVar = &utf8; } #endif