]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve detection of corrupt database records in fts5.
authordan <Dan Kennedy>
Mon, 11 May 2026 11:53:07 +0000 (11:53 +0000)
committerdan <Dan Kennedy>
Mon, 11 May 2026 11:53:07 +0000 (11:53 +0000)
FossilOrigin-Name: 87b653731171a26396f9796b0a5c436593571d39e991d8d040ef4473cf459b67

ext/fts5/fts5_index.c
ext/fts5/test/fts5corrupt3.test
ext/fts5/test/fts5corrupt5.test
ext/fts5/test/fts5corruptA.test
manifest
manifest.uuid

index 29be766042b6264bc487cac2bef3ce0ddcd67011..374a00e8877afa7cb341500c7e77abdef3c7ae4e 100644 (file)
@@ -2576,6 +2576,10 @@ static void fts5LeafSeek(
     if( nKeep<nMatch ){
       goto search_failed;
     }
+    if( (iOff+nNew)>n ){
+      FTS5_CORRUPT_ITER(p, pIter);
+      return;
+    }
 
     assert( nKeep>=nMatch );
     if( nKeep==nMatch ){
index 20be7c45cfdafa2124157680293500b894d5b77b..38621751a016369605ca08585b3ed6fc5bdeb7af 100644 (file)
@@ -15153,9 +15153,9 @@ do_execsql_test 78.1 {
   CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col');
 }
 
-do_execsql_test 78.2 {
+do_catchsql_test 78.2 {
   SELECT count(rowid) FROM t3 WHERE term>='nsocse';
-} 2
+} {1 {database disk image is malformed}}
 
 #-------------------------------------------------------------------------
 reset_db
index 4b21a9ff74b16b306d2af9a5877b5908d5387f86..6a16214a3c078eb1336597498166994c091024ef 100644 (file)
@@ -1220,7 +1220,7 @@ do_test 8.0 {
 
 do_catchsql_test 8.1 {
   SELECT rowid FROM t1('a* NOT ý\91') ;
-} {0 {1 2 3 4 5 6 7}}
+} {1 {fts5: corruption on page 1, segment 1, table "t1"}}
 
 #-------------------------------------------------------------------------
 reset_db
index 838cded5780fa564a2b9ddccb7eca3c25618e287..925b2f936046ba1b6afe0313f8c2cbf57678e2d3 100644 (file)
@@ -68,5 +68,34 @@ do_catchsql_test 1.5 {
   SELECT rowid FROM t WHERE t MATCH 'a'
 } {1 {fts5: corruption found reading blob 137438953481 from table "t"}}
 
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 2.0 {
+  CREATE VIRTUAL TABLE t1 USING fts5(a);
+  BEGIN;
+    INSERT INTO t1(rowid, a) VALUES(1, 'aaaa');
+    INSERT INTO t1(rowid, a) VALUES(2, 'bbbb');
+    INSERT INTO t1(rowid, a) VALUES(3, 'cccc');
+  COMMIT;
+}
+
+db close
+
+do_test 2.1 {
+  set hex [hexio_read test.db 0 [file size test.db]]
+  set off [string first "010463636363" $hex]
+  set hex [string replace $hex $off [expr $off+11] 017F63636363]
+  hexio_write test.db 0 $hex
+  set {} {}
+} {}
+
+sqlite3 db test.db
+
+do_catchsql_test 2.2 {
+  SELECT rowid FROM t1('cccccccccccccccccccccccccccccccccccccccccccccccc');
+} {1 {fts5: corruption on page 1, segment 1, table "t1"}}
+
 sqlite3_fts5_may_be_corrupt 0
 finish_test
+
index 3a6e64b94e2635134eaa36b3b3373b0616b07aa5..7cfd623c6c325f97074e5f979f63151ede635bc7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\spotential\sbuffer\soverwrite\sthat\scould\soccur\sin\sfts5\swhen\sprocessing\scorrupt\srecords.
-D 2026-05-11T11:12:06.895
+C Improve\sdetection\sof\scorrupt\sdatabase\srecords\sin\sfts5.
+D 2026-05-11T11:53:07.269
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -113,7 +113,7 @@ F ext/fts5/fts5_buffer.c dcc3f0352339fe79c9d8abbc1c2009bc3469206467880bf43558447
 F ext/fts5/fts5_config.c bfba970fe1e4eed18ee57c8d51458e226db9a960ddf775c5e50e3d76603a667e
 F ext/fts5/fts5_expr.c 71d48e8cf0358deace4949276647d317ff7665db6db09f40b81e2e7fe6664c7c
 F ext/fts5/fts5_hash.c d5871df92ce3fa210a650cf419ee916b87c29977e86084d06612edf772bff6f5
-F ext/fts5/fts5_index.c 957534376f8ee60d4fd9af5d7d968831abf1c8cac7a6799b90acb5cd3b9ba25a
+F ext/fts5/fts5_index.c ef212de7aed4872fbf3c414f501b8586a4870f282e79e5f5c083e8fc816c1eea
 F ext/fts5/fts5_main.c b0fed47b3b4420ba6810373480a75bc28a9c0b7d16478d19a396436fb3ff17d7
 F ext/fts5/fts5_storage.c 19bc7c4cbe1e6a2dd9849ef7d84b5ca1fcbf194cefc3e386b901e00e08bf05c2
 F ext/fts5/fts5_tcl.c 2be6cc14f9448f720fd4418339cd202961a0801ea9424cb3d9de946f8f5a051c
@@ -162,14 +162,14 @@ F ext/fts5/test/fts5contentless4.test ec34dc69ef474ca9997dae6d91e072906e0e9a5a4b
 F ext/fts5/test/fts5contentless5.test 38cd0392c730dc7090c550321ce3c24ba4c392bc97308b51a4180e9959dca7b5
 F ext/fts5/test/fts5corrupt.test 237fce1c3261bb3a5bec333b0f0dbf5b105ec32627ef14cccbda3cfe13833193
 F ext/fts5/test/fts5corrupt2.test 4a03a158c2cb617c9f76d26b35c1ef2534124bc0bbddcea38dfd5b170ebea27b
-F ext/fts5/test/fts5corrupt3.test e489b51b6c4ded2a808e0f78bdbe126f6d369de41a59ac2717878e37fc3db0e8
+F ext/fts5/test/fts5corrupt3.test 121a8a7622dfe1be1bc55cbe70eddd6a3416f76a837dc8c06a11a32e781595a4
 F ext/fts5/test/fts5corrupt4.test dc08d19f5b8943e95a7778a7d8da592042504faf18dd93f68f7d7a0d7d7dd733
-F ext/fts5/test/fts5corrupt5.test 73985d4fe6d8f0d5d5c7bcf79ae7c6522c376cd6ad710a0ff2f26e0c2e222abe
+F ext/fts5/test/fts5corrupt5.test 329fb0e21b1dfb9752e1769ca078f27a8e99cfcc017055c8a6d724011b73c9c6
 F ext/fts5/test/fts5corrupt6.test 2d72db743db7b5d9c9a6d0cfef24d799ed1aa5e8192b66c40e871a37ed9eed06
 F ext/fts5/test/fts5corrupt7.test 814aab492d7a09abb5bfdd81cc66fc206d7f3868f9a3bae91876e02efc466fb3
 F ext/fts5/test/fts5corrupt8.test 0b10750caf8aa23fa1c379ca4caf6130d41454505e4d5315590f4061eedcbe44
 F ext/fts5/test/fts5corrupt9.test 4253b9b59f33effac8b67da72ec34309c738aca2d5e8e2656bfbbd6a489a1dfe
-F ext/fts5/test/fts5corruptA.test 944c40f8da0f5db581ce60d32f82fb0eeb1af4dd8ea3172c207873082a0309a4
+F ext/fts5/test/fts5corruptA.test 592787ad5f4e10177861e1efa231819a9d77038f8c605c81c7e41b63c2436f15
 F ext/fts5/test/fts5corruptbig.test 9f95b40fa36e292feceab02b2ef06e21878bfa1ac7afefa138aae05518b51774
 F ext/fts5/test/fts5delete.test 2a5008f8b1174ef41d1974e606928c20e4f9da77d9f8347aed818994d89cced4
 F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4
@@ -2204,8 +2204,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P c4a6e62b5f36f9df988d2ec12a92a614e9e813cdcd50198ec2827c33745a362a
-R f530d7c8db944db9f53748a1ac21750c
+P 4a5ad516ea93926c0d5206b4d72c3675905d2bf666b27a649256b93eb95c671b
+R 865af529eea3342e181da8938ef806ff
 U dan
-Z 2ea807a6fd2cda207a366790e8ee04ce
+Z a39b47d6b7d9419acca90fe50f12d1aa
 # Remove this line to create a well-formed Fossil manifest.
index b1bc3fba20f7cf5e6317fd17de74993756544d34..26d8911f631a21640502ceee27485c4eab1baeba 100644 (file)
@@ -1 +1 @@
-4a5ad516ea93926c0d5206b4d72c3675905d2bf666b27a649256b93eb95c671b
+87b653731171a26396f9796b0a5c436593571d39e991d8d040ef4473cf459b67