From: drh Date: Tue, 24 Mar 2015 14:05:50 +0000 (+0000) Subject: More defenses against virtual table being deleted out from under a running X-Git-Tag: version-3.8.9~38^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f496a7dc81dd0b2cc0c823a13a836f6a22001a4f;p=thirdparty%2Fsqlite.git More defenses against virtual table being deleted out from under a running statement. FossilOrigin-Name: 116c99823022c017946b6088878a2d46759deb6e --- diff --git a/manifest b/manifest index 3cbfeae1e3..faa3a9efb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sa\svirtual\stable\sfrom\sbeing\sdestroyed\swhile\sit\sis\sin\suse. -D 2015-03-24T13:32:53.812 +C More\sdefenses\sagainst\svirtual\stable\sbeing\sdeleted\sout\sfrom\sunder\sa\srunning\nstatement. +D 2015-03-24T14:05:50.045 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 88a3e6261286db378fdffa1124cad11b3c05f5bb F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -293,11 +293,11 @@ F src/update.c 3c4ecc282accf12d39edb8d524cf089645e55a13 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c 98a7627ca48ad3265b6940915a1d08355eb3fc7e F src/vacuum.c 9460b9de7b2d4e34b0d374894aa6c8a0632be8ec -F src/vdbe.c 1524e1db29a85d8e376d0f4ef2109c5296dcd83b +F src/vdbe.c bbfede5a8a6908b3ddcd55fdb0b2301288dd4754 F src/vdbe.h 6fc69d9c5e146302c56e163cb4b31d1ee64a18c3 F src/vdbeInt.h 9cbaa84f53ddd2d09a0cf61a94337a3a035d08a0 F src/vdbeapi.c 583d56b129dd27f12bed518270de9ebe521e6a75 -F src/vdbeaux.c 741cccd410f75f6dcd9dde66c1e0601c956a42ae +F src/vdbeaux.c 056eefd33ef4457240b6d3156a96201579face0a F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90 F src/vdbemem.c c0dc81285b7571b0a31c40f17846fe2397ec1cd9 F src/vdbesort.c 919717d7599fa31d343ec28bffd0f9e91a4ff5f6 @@ -1246,7 +1246,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9faefb96272967e731e83ef516a8c1e1b876391b -R 281e744f7b786f4abb8205e460d3cd79 +P fba674c083286dabb37fed9357b67593b56ed3a5 +R 6651e18da796c17c1ca503ba6b1b311c U drh -Z 8d74d67cd7bcd5c907dded9ec155ff27 +Z 91702967a80a94e761fcc487487cb422 diff --git a/manifest.uuid b/manifest.uuid index cd8c7c5fbd..625bb648cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fba674c083286dabb37fed9357b67593b56ed3a5 \ No newline at end of file +116c99823022c017946b6088878a2d46759deb6e \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 82c313a2d9..ec5e6d7442 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6063,14 +6063,17 @@ case OP_VOpen: { VdbeCursor *pCur; sqlite3_vtab_cursor *pVtabCursor; sqlite3_vtab *pVtab; - sqlite3_module *pModule; + const sqlite3_module *pModule; assert( p->bIsReader ); pCur = 0; pVtabCursor = 0; pVtab = pOp->p4.pVtab->pVtab; - pModule = (sqlite3_module *)pVtab->pModule; - assert(pVtab && pModule); + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + break; + } + pModule = pVtab->pModule; rc = pModule->xOpen(pVtab, &pVtabCursor); sqlite3VtabImportErrmsg(p, pVtab); if( SQLITE_OK==rc ){ @@ -6312,7 +6315,7 @@ case OP_VRename: { */ case OP_VUpdate: { sqlite3_vtab *pVtab; - sqlite3_module *pModule; + const sqlite3_module *pModule; int nArg; int i; sqlite_int64 rowid; @@ -6324,7 +6327,11 @@ case OP_VUpdate: { ); assert( p->readOnly==0 ); pVtab = pOp->p4.pVtab->pVtab; - pModule = (sqlite3_module *)pVtab->pModule; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + break; + } + pModule = pVtab->pModule; nArg = pOp->p2; assert( pOp->p4type==P4_VTAB ); if( ALWAYS(pModule->xUpdate) ){ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index bd00786ebc..25840ccde8 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1118,7 +1118,8 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ #ifndef SQLITE_OMIT_VIRTUALTABLE case P4_VTAB: { sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab; - sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", pVtab, pVtab->pModule); + sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", + pVtab, pVtab ? pVtab->pModule : (sqlite3_module*)0); break; } #endif