fts5corruptA.test uses `unhex()` which isn't in sqlite 3.34 yet, so I removed that part. Corruption error messages are also less verbose before 3.50.
77 lines
2.1 KiB
Diff
77 lines
2.1 KiB
Diff
Index: ext/fts5/fts5_index.c
|
|
==================================================================
|
|
--- a/ext/fts5/fts5_index.c
|
|
+++ b/ext/fts5/fts5_index.c
|
|
@@ -708,7 +708,7 @@ static void fts5DataRelease(Fts5Data *pData){
|
|
static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){
|
|
Fts5Data *pRet = fts5DataRead(p, iRowid);
|
|
if( pRet ){
|
|
- if( pRet->nn<4 || pRet->szLeaf>pRet->nn ){
|
|
+ if( pRet->szLeaf<4 || pRet->szLeaf>pRet->nn ){
|
|
p->rc = FTS5_CORRUPT;
|
|
fts5DataRelease(pRet);
|
|
pRet = 0;
|
|
ADDED ext/fts5/test/fts5corruptA.test
|
|
Index: ext/fts5/test/fts5corruptA.test
|
|
==================================================================
|
|
--- /dev/null
|
|
+++ b/ext/fts5/test/fts5corruptA.test
|
|
@@ -0,0 +1,57 @@
|
|
+# 2026 May 11
|
|
+#
|
|
+# The author disclaims copyright to this source code. In place of
|
|
+# a legal notice, here is a blessing:
|
|
+#
|
|
+# May you do good and not evil.
|
|
+# May you find forgiveness for yourself and forgive others.
|
|
+# May you share freely, never taking more than you give.
|
|
+#
|
|
+#***********************************************************************
|
|
+#
|
|
+
|
|
+source [file join [file dirname [info script]] fts5_common.tcl]
|
|
+set testprefix fts5corruptA
|
|
+
|
|
+# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
|
|
+ifcapable !fts5 {
|
|
+ finish_test
|
|
+ return
|
|
+}
|
|
+sqlite3_fts5_may_be_corrupt 1
|
|
+
|
|
+do_execsql_test 1.0 {
|
|
+ CREATE VIRTUAL TABLE t USING fts5(x, detail='full');
|
|
+ INSERT INTO t(t, rank) VALUES('pgsz', 32);
|
|
+}
|
|
+
|
|
+set big [string repeat "a " 200]
|
|
+do_execsql_test 1.1 {
|
|
+ INSERT INTO t(rowid, x) VALUES(1, $big)
|
|
+}
|
|
+
|
|
+do_test 1.2 {
|
|
+ db eval {
|
|
+ SELECT min(rowid) AS base_rowid, count(*) AS page_count FROM t_data
|
|
+ WHERE rowid>1000
|
|
+ } {}
|
|
+} {}
|
|
+
|
|
+db close
|
|
+
|
|
+do_test 1.4 {
|
|
+ set hex [hexio_read test.db 0 [file size test.db]]
|
|
+
|
|
+ set off [string first "023061018310" $hex]
|
|
+ set hex [string replace $hex $off [expr $off+11] 023061018370]
|
|
+ hexio_write test.db 0 $hex
|
|
+} {6144}
|
|
+
|
|
+sqlite3 db test.db
|
|
+
|
|
+do_catchsql_test 1.5 {
|
|
+ SELECT rowid FROM t WHERE t MATCH 'a'
|
|
+} {1 {database disk image is malformed}}
|
|
+
|
|
+sqlite3_fts5_may_be_corrupt 0
|
|
+finish_test
|