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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 E4`tcEb^rhX delta 15648 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