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

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