From c72f2fb7feff582444b8ffdc6c900c69847ce8a9 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 Nov 2019 23:47:40 +0000 Subject: [PATCH] More improvements to shadow table corruption detection in FTS3. FossilOrigin-Name: 51525f9c3235967bc00a090e84c70a6400698c897aa4742e817121c725b8c99d --- ext/fts3/fts3.c | 4 ++++ ext/fts3/fts3Int.h | 10 ++++++++++ ext/fts3/fts3_write.c | 14 +++++++++++--- manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1390592 -> 1396736 bytes 6 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index f90c7a56f0..e8e909a97b 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -1486,6 +1486,10 @@ static int fts3InitVtab( fts3DatabasePageSize(&rc, p); p->nNodeSize = p->nPgsz-35; +#if defined(SQLITE_DEBUG)||defined(SQLITE_TEST) + p->nMergeCount = FTS3_MERGE_COUNT; +#endif + /* Declare the table schema to SQLite. */ fts3DeclareVtab(&rc, p); diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 8aebfcd387..3c58e49583 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -301,9 +301,19 @@ struct Fts3Table { /* True to disable the incremental doclist optimization. This is controled ** by special insert command 'test-no-incr-doclist'. */ int bNoIncrDoclist; + + /* Number of segments in a level */ + int nMergeCount; #endif }; +/* Macro to find the number of segments to merge */ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +# define MergeCount(P) ((P)->nMergeCount) +#else +# define MergeCount(P) FTS3_MERGE_COUNT +#endif + /* ** When the core wants to read from the virtual table, it creates a ** virtual table cursor (an instance of the following structure) using diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 658d0d214f..7d6f365b17 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1153,7 +1153,7 @@ static int fts3AllocateSegdirIdx( ** segment and allocate (newly freed) index 0 at level iLevel. Otherwise, ** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext. */ - if( iNext>=FTS3_MERGE_COUNT ){ + if( iNext>=MergeCount(p) ){ fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel)); rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel); *piIdx = 0; @@ -4280,6 +4280,10 @@ static int fts3IncrmergeLoad( int i; int nHeight = (int)aRoot[0]; NodeWriter *pNode; + if( nHeight<1 || nHeight>FTS_MAX_APPENDABLE_HEIGHT ){ + sqlite3_reset(pSelect); + return FTS_CORRUPT_VTAB; + } pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT; pWriter->iStart = iStart; @@ -5048,7 +5052,7 @@ static int fts3DoIncrmerge( const char *zParam /* Nul-terminated string containing "A,B" */ ){ int rc; - int nMin = (FTS3_MERGE_COUNT / 2); + int nMin = (MergeCount(p) / 2); int nMerge = 0; const char *z = zParam; @@ -5093,7 +5097,7 @@ static int fts3DoAutoincrmerge( int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; p->nAutoincrmerge = fts3Getint(&zParam); - if( p->nAutoincrmerge==1 || p->nAutoincrmerge>FTS3_MERGE_COUNT ){ + if( p->nAutoincrmerge==1 || p->nAutoincrmerge>MergeCount(p) ){ p->nAutoincrmerge = 8; } if( !p->bHasStat ){ @@ -5384,6 +5388,10 @@ static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){ }else if( nVal>21 && 0==sqlite3_strnicmp(zVal,"test-no-incr-doclist=",21) ){ p->bNoIncrDoclist = atoi(&zVal[21]); rc = SQLITE_OK; + }else if( nVal>11 && 0==sqlite3_strnicmp(zVal,"mergecount=",11) ){ + v = atoi(&zVal[11]); + if( v>=4 && v<=FTS3_MERGE_COUNT && (v&1)==0 ) p->nMergeCount = v; + rc = SQLITE_OK; } #endif } diff --git a/manifest b/manifest index 2585239f61..5ac9aeea34 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\scorrupt\sshadow\stables\sin\sFTS3.\s\sEnable\sthe\sdebugging\nspecial-inserts\sfor\sFTS3\sfor\sboth\sSQLITE_DEBUG\sand\sSQLITE_TEST. -D 2019-11-16T21:40:49.550 +C More\simprovements\sto\sshadow\stable\scorruption\sdetection\sin\sFTS3. +D 2019-11-16T23:47:40.269 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -81,9 +81,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 6184d5748b51301f401eda0d3e5ad0caa19b4b95c0520cdd1f83a74e3a1c97dc +F ext/fts3/fts3.c ad760e49a68d13c11f611d7532d7f2277924df6d4a43cbaf8acf7693e1e83aab F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h b879664f543ce352815461cacd828f2606716e46e47323875eddfe100d8b7711 +F ext/fts3/fts3Int.h 31f2ceee083d93254d84ab7a69eddb253e079bfe7e35c15413c0132f8947d6b6 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c f7d443ebe2cdf0a8515edb7588c8aab77108cc28ede9ced8baa416c95aa810cb +F ext/fts3/fts3_write.c 84f7b1390b85e6630d46fc1162f6138ce08aabcf9d57289db8fa1e04602cd3e9 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -1016,7 +1016,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 053981588014b4e1e5bc8beaf7034671e133cee853a0f2dd9c8d444be1a97fe5 +F test/fuzzdata8.db 1490d840640e5ace4ec8e10e252681497fd7d5ffbb6b783bd3899fa789698226 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1849,7 +1849,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 bae76a5c40703871e5ce4cd23d6fae5a3836606f524a63b01ac828c7a602c5e9 -R b5d91364fca42dbea07f58830b5ec589 +P 04b2873be5aedeb1c4325cf36c4b5d180f929a641caf1e3829c03778adb29c8e +R c4135a72f080b6416943cb56e5f0bed9 U drh -Z baf295687228d1300e4112b17540730f +Z 628c9e8e0d5353ed3a948a9f5a3cad9a diff --git a/manifest.uuid b/manifest.uuid index 43f64260ca..40ad128337 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -04b2873be5aedeb1c4325cf36c4b5d180f929a641caf1e3829c03778adb29c8e \ No newline at end of file +51525f9c3235967bc00a090e84c70a6400698c897aa4742e817121c725b8c99d \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 52385464373000b833e8408fa906f902aa67446b..7b4a3d38545776438502730d78b2e37afc8217aa 100644 GIT binary patch delta 18951 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 UWWI(14I_>Lrk8r3=Ht8lA4(>&vH$=8 -- 2.47.3