aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2015-03-24 14:05:50 +0000
committerdrh <drh@noemail.net>2015-03-24 14:05:50 +0000
commitf496a7dc81dd0b2cc0c823a13a836f6a22001a4f (patch)
tree59361a612e77b9da222c4898d9da9a3b6e5951c8 /src
parenta68d62829134f97df079b7b9c25fce44e1984f8f (diff)
downloadsqlite-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.c17
-rw-r--r--src/vdbeaux.c3
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