diff options
author | drh <drh@noemail.net> | 2015-03-24 14:05:50 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2015-03-24 14:05:50 +0000 |
commit | f496a7dc81dd0b2cc0c823a13a836f6a22001a4f (patch) | |
tree | 59361a612e77b9da222c4898d9da9a3b6e5951c8 /src | |
parent | a68d62829134f97df079b7b9c25fce44e1984f8f (diff) | |
download | sqlite-f496a7dc81dd0b2cc0c823a13a836f6a22001a4f.tar.gz sqlite-f496a7dc81dd0b2cc0c823a13a836f6a22001a4f.zip |
More defenses against virtual table being deleted out from under a running
statement.
FossilOrigin-Name: 116c99823022c017946b6088878a2d46759deb6e
Diffstat (limited to 'src')
-rw-r--r-- | src/vdbe.c | 17 | ||||
-rw-r--r-- | src/vdbeaux.c | 3 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/vdbe.c b/src/vdbe.c index 82c313a2d..ec5e6d744 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 bd00786eb..25840ccde 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 |