Blame SOURCES/sqlite-3.26.0-CVE-2020-13631.patch

ec7966
Subject: [PATCH] Do not allow a virtual table to be renamed into the name of
ec7966
 one of its shadows.
ec7966
ec7966
---
ec7966
 src/alter.c     |  5 ++++-
a87669
 src/build.c     | 29 +++++++++++++++++++++++------
ec7966
 src/sqliteInt.h |  5 +++++
a87669
 3 files changed, 32 insertions(+), 7 deletions(-)
ec7966
ec7966
diff --git a/src/alter.c b/src/alter.c
ec7966
index 1280e90..0fa24c0 100644
ec7966
--- a/src/alter.c
ec7966
+++ b/src/alter.c
ec7966
@@ -117,7 +117,10 @@ void sqlite3AlterRenameTable(
ec7966
   /* Check that a table or index named 'zName' does not already exist
ec7966
   ** in database iDb. If so, this is an error.
ec7966
   */
ec7966
-  if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){
ec7966
+  if( sqlite3FindTable(db, zName, zDb)
ec7966
+   || sqlite3FindIndex(db, zName, zDb)
ec7966
+   || sqlite3IsShadowTableOf(db, pTab, zName)
ec7966
+  ){
ec7966
     sqlite3ErrorMsg(pParse, 
ec7966
         "there is already another table or index with this name: %s", zName);
ec7966
     goto exit_rename_table;
ec7966
diff --git a/src/build.c b/src/build.c
a87669
index e0fed8a..afe4171 100644
ec7966
--- a/src/build.c
ec7966
+++ b/src/build.c
a87669
@@ -1899,6 +1899,28 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
ec7966
   recomputeColumnsNotIndexed(pPk);
ec7966
 }
ec7966
 
ec7966
+
ec7966
+#ifndef SQLITE_OMIT_VIRTUALTABLE
ec7966
+/*
ec7966
+** Return true if pTab is a virtual table and zName is a shadow table name
ec7966
+** for that virtual table.
ec7966
+*/
ec7966
+int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){
ec7966
+  int nName;                    /* Length of zName */
a87669
+  Module *pMod;                 /* Module for the virtual table */
ec7966
+
ec7966
+  if( !IsVirtual(pTab) ) return 0;
ec7966
+  nName = sqlite3Strlen30(pTab->zName);
ec7966
+  if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0;
ec7966
+  if( zName[nName]!='_' ) return 0;
a87669
+  pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
ec7966
+  if( pMod==0 ) return 0;
ec7966
+  if( pMod->pModule->iVersion<3 ) return 0;
ec7966
+  if( pMod->pModule->xShadowName==0 ) return 0;
ec7966
+  return pMod->pModule->xShadowName(zName+nName+1);
ec7966
+}
ec7966
+#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
ec7966
+
ec7966
 #ifndef SQLITE_OMIT_VIRTUALTABLE
ec7966
 /*
ec7966
 ** Return true if zName is a shadow table name in the current database
a87669
@@ -1910,7 +1932,6 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
ec7966
 static int isShadowTableName(sqlite3 *db, char *zName){
ec7966
   char *zTail;                  /* Pointer to the last "_" in zName */
ec7966
   Table *pTab;                  /* Table that zName is a shadow of */
ec7966
-  Module *pMod;                 /* Module for the virtual table */
ec7966
 
ec7966
   zTail = strrchr(zName, '_');
ec7966
   if( zTail==0 ) return 0;
a87669
@@ -1919,11 +1940,7 @@ static int isShadowTableName(sqlite3 *db, char *zName){
ec7966
   *zTail = '_';
ec7966
   if( pTab==0 ) return 0;
ec7966
   if( !IsVirtual(pTab) ) return 0;
ec7966
-  pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]);
ec7966
-  if( pMod==0 ) return 0;
ec7966
-  if( pMod->pModule->iVersion<3 ) return 0;
ec7966
-  if( pMod->pModule->xShadowName==0 ) return 0;
ec7966
-  return pMod->pModule->xShadowName(zTail+1);
ec7966
+  return sqlite3IsShadowTableOf(db, pTab, zName);
ec7966
 }
ec7966
 #else
ec7966
 # define isShadowTableName(x,y) 0
ec7966
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
ec7966
index b7d3571..76337f7 100644
ec7966
--- a/src/sqliteInt.h
ec7966
+++ b/src/sqliteInt.h
ec7966
@@ -4407,6 +4407,11 @@ void sqlite3AutoLoadExtensions(sqlite3*);
ec7966
    );
ec7966
 #  define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
ec7966
 #endif
ec7966
+#ifndef SQLITE_OMIT_VIRTUALTABLE
ec7966
+  int sqlite3IsShadowTableOf(sqlite3*,Table*,const char*);
ec7966
+#else
ec7966
+# define sqlite3IsShadowTableOf(A,B,C) 0
ec7966
+#endif
ec7966
 int sqlite3VtabEponymousTableInit(Parse*,Module*);
ec7966
 void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
ec7966
 void sqlite3VtabMakeWritable(Parse*,Table*);
ec7966
-- 
ec7966
2.24.1
ec7966