From: drh Date: Sat, 5 Jan 2019 21:09:37 +0000 (+0000) Subject: If the OP_ParseSchema opcode with a non-NULL P4 operand does not parse any X-Git-Tag: version-3.27.0~203 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b86e51eea956e5b3532f4042d8a314556746bef;p=thirdparty%2Fsqlite.git If the OP_ParseSchema opcode with a non-NULL P4 operand does not parse any rows out of the sqlite_master table, that indicates that the sqlite_master table is corrupt, so raise an SQLITE_CORRUPT error. FossilOrigin-Name: 598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda --- diff --git a/manifest b/manifest index 34a8e16435..1c1713d76a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stwo\smore\sproblems\swith\scorrupt\sdatabase\shandling\sin\sfts5. -D 2019-01-05T07:17:56.201 +C If\sthe\sOP_ParseSchema\sopcode\swith\sa\snon-NULL\sP4\soperand\sdoes\snot\sparse\sany\nrows\sout\sof\sthe\ssqlite_master\stable,\sthat\sindicates\sthat\sthe\ssqlite_master\ntable\sis\scorrupt,\sso\sraise\san\sSQLITE_CORRUPT\serror. +D 2019-01-05T21:09:37.530 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in d8b254f8bb81bab43c340d70d17dc3babab40fcc8a348c8255881f780a45fee6 @@ -507,7 +507,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c ddc9fc7d9861cf3a1f30660264b76b1ae9e1dce5dbba085cf001d5cb6b41cf8c F src/pragma.c 20811b404b6d302a1bedd4b8af8aab2794c5e87ba1f5cb6b42dbc3266ad9c603 F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 -F src/prepare.c d0918fb8d00b1ebf19655e7f3d28464b3fc3c43c16d36dd06092de02244a5180 +F src/prepare.c 18f1d2801ffb48b83fddf83375389886c788e98fdfb87eabe988cf53893602c7 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 5f2f987aacba7548d10781f808e1b933f80abe0b6bc8e9922bc18b1d1faba339 @@ -517,7 +517,7 @@ F src/shell.c.in 0722a9e3a1b23674f07c194b8f71c953c775bad280e7f179a32bf72cd009b56 F src/sqlite.h.in b54cd42d2f3b739a00de540cafe2dcd0de3b8e1748a2db33a68def487e9e602f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h a86007d427b9a7b97e9f1e1e0911eba3f70e1a3764a0a0aff0efd4d7bb029001 +F src/sqliteInt.h 488f9b86c15d09d42af921e4e2383dac289aa541a59daf78822bfcd656b59ff9 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -583,7 +583,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c 66d077541de6c0d9bf131d8f8a20d5dec583131d48b8b3aa7c1a0a2bed6998fa +F src/vdbe.c 1919d490e97bfc59eab4d43444a53a6717d06137295ed684a25e5df7430d9974 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -1797,7 +1797,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa98748f956cff95fcfda3a513cea4df27aa573ae795a6855c40bfeca661d0b2 -R 147ceafc97353ccc27daff5abe75340f -U dan -Z 57ee5d6eb6a1f6b65219f39ba61a5e10 +P 444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 +R 8de40bf74ae55cb339d0834a33043a83 +U drh +Z 0ecb0f548cba4686a2646d7c9efbc968 diff --git a/manifest.uuid b/manifest.uuid index 1b424e700b..a0bb07c982 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -444c7c99beb9f8b82963e9784aa2be54124c7011f4771122b4f608c02aa26408 \ No newline at end of file +598d7358e7329f0de6e3defc217665909e46874258ac29592ee2fd53e6411cda \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index b43a37f1fd..2c5f410253 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -65,6 +65,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); + pData->nInitRow++; if( db->mallocFailed ){ corruptSchema(pData, argv[0], 0); return 1; @@ -176,6 +177,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; + initData.nInitRow = 0; sqlite3InitCallback(&initData, 3, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 294f7043fb..17c93285b8 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3362,6 +3362,7 @@ typedef struct { int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ int rc; /* Result code stored here */ u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ } InitData; /* diff --git a/src/vdbe.c b/src/vdbe.c index 14f72d0a36..82ab91e0e2 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5799,9 +5799,16 @@ case OP_ParseSchema: { assert( db->init.busy==0 ); db->init.busy = 1; initData.rc = SQLITE_OK; + initData.nInitRow = 0; assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } sqlite3DbFreeNN(db, zSql); db->init.busy = 0; }