]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an OOB read caused by passing an out-of-range phrase number to fts5 auxiliary...
authordan <Dan Kennedy>
Mon, 6 Jul 2026 16:04:51 +0000 (16:04 +0000)
committerdan <Dan Kennedy>
Mon, 6 Jul 2026 16:04:51 +0000 (16:04 +0000)
FossilOrigin-Name: aeb85fdfca0a546cfd3ef26efd58b9ffc8d5fda15562558d8479dee55321596f

ext/fts5/fts5_main.c
ext/fts5/test/fts5aux.test
manifest
manifest.uuid

index 2e3b5b3af52d4b710727f6774c0c2a8d14c5074d..8faae3c93c57197e272190745808d68c057f9fbd 100644 (file)
@@ -2704,19 +2704,23 @@ static int fts5ApiPhraseFirstColumn(
 
   if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){
     Fts5Sorter *pSorter = pCsr->pSorter;
-    int n;
-    if( pSorter ){
-      int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]);
-      n = pSorter->aIdx[iPhrase] - i1;
-      pIter->a = &pSorter->aPoslist[i1];
+    if( iPhrase<0 || iPhrase>=sqlite3Fts5ExprPhraseCount(pCsr->pExpr) ){
+      rc = SQLITE_RANGE;
     }else{
-      rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n);
-    }
-    if( rc==SQLITE_OK ){
-      assert( pIter->a || n==0 );
-      pIter->b = (pIter->a ? &pIter->a[n] : 0);
-      *piCol = 0;
-      fts5ApiPhraseNextColumn(pCtx, pIter, piCol);
+      int n;
+      if( pSorter ){
+        int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]);
+        n = pSorter->aIdx[iPhrase] - i1;
+        pIter->a = &pSorter->aPoslist[i1];
+      }else{
+        rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n);
+      }
+      if( rc==SQLITE_OK ){
+        assert( pIter->a || n==0 );
+        pIter->b = (pIter->a ? &pIter->a[n] : 0);
+        *piCol = 0;
+        fts5ApiPhraseNextColumn(pCtx, pIter, piCol);
+      }
     }
   }else{
     int n;
index 960dbc5117c6b256fed9278ff640f4974930e703..5a01ec30d7300e8b4bd5a8ec75b0a93b9a88199f 100644 (file)
@@ -377,6 +377,10 @@ do_catchsql_test 12.3.3 {
   SELECT fts5_collist(t1, 1) FROM t1('one AND two');
 } {0 1}
 
+do_catchsql_test 12.3.4 {
+  SELECT fts5_collist(t1, 15000) FROM t1('one AND two');
+} {1 SQLITE_RANGE}
+
 #-------------------------------------------------------------------------
 reset_db
 do_execsql_test 13.1 {
@@ -401,4 +405,33 @@ do_catchsql_test 13.4 {
   SELECT highlight(t1, 0, '[', ']') FROM t1
 } {1 {SQL logic error}}
 
+#-------------------------------------------------------------------------
+
+foreach_detail_mode $testprefix {
+  reset_db
+  fts5_aux_test_functions db
+
+  do_execsql_test 14.0 {
+    CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
+    INSERT INTO t1 VALUES('one two three');
+    INSERT INTO t1 VALUES('three two one');
+  }
+
+  do_catchsql_test 14.1 {
+    SELECT fts5_collist(t1, 15000) FROM t1('one AND two');
+  } {1 SQLITE_RANGE}
+
+  do_catchsql_test 14.2 {
+    SELECT fts5_collist(t1, 0) FROM t1('one AND two');
+  } {0 {0 0}}
+
+  do_catchsql_test 14.3 {
+    SELECT fts5_collist(t1, 0) FROM t1('one AND two') ORDER BY rank;
+  } {0 {0 0}}
+
+  do_catchsql_test 14.3 {
+    SELECT fts5_collist(t1, 15000) FROM t1('one AND two') ORDER BY rank;
+  } {1 SQLITE_RANGE}
+}
+
 finish_test
index 8a54252b0b04940c29045b3d09733ce51d70aa04..1c996f25683d5b991faa30ec07c153a3a8bcef19 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\sin\sthe\sfossil-delta\simplementation\swithin\sRBU\scausing\sit\sto\sreject\ssome\swell-formed\sdelta\srecords.\sBug\s[bugs:/info/2026-07-06T13:01:22Z\s|\s2026-07-06T13:01:22Z].
-D 2026-07-06T15:13:52.085
+C Fix\san\sOOB\sread\scaused\sby\spassing\san\sout-of-range\sphrase\snumber\sto\sfts5\sauxiliary\sAPI\sxPhraseFirstColumn()\sin\sdetail=columns\smode.
+D 2026-07-06T16:04:51.815
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -115,7 +115,7 @@ F ext/fts5/fts5_config.c bfba970fe1e4eed18ee57c8d51458e226db9a960ddf775c5e50e3d7
 F ext/fts5/fts5_expr.c b906c59e9e842805cc3eea4e131b822e586bb01260e542f67920c61798dcb53d
 F ext/fts5/fts5_hash.c 341a08ad0153b397b819ef3d7a7959c1dc3c84a6988a431d93dece8bd62ae10e
 F ext/fts5/fts5_index.c 8be7cc58317fdef4dc4a352fcfdd7811b74b9b6be08bf6edeb237459bd045cc5
-F ext/fts5/fts5_main.c b0fed47b3b4420ba6810373480a75bc28a9c0b7d16478d19a396436fb3ff17d7
+F ext/fts5/fts5_main.c 7819fc80808a135c3ad7bec65071a053827d1e8fe7b77ddfd734ed451c2db7a9
 F ext/fts5/fts5_storage.c 46b0024fdd8002fbfba162230e5cc212c8f019ba4075396860354bfaf549a546
 F ext/fts5/fts5_tcl.c 2be6cc14f9448f720fd4418339cd202961a0801ea9424cb3d9de946f8f5a051c
 F ext/fts5/fts5_test_mi.c 4308d5658cb1f5eee5998dcbaac7d5bdf7a2ef43c8192ca6e0c843f856ccee26
@@ -141,7 +141,7 @@ F ext/fts5/test/fts5ak.test 25e2f8afdcff30d98ca9dee8c5cacca2f26db17501c9401f16d9
 F ext/fts5/test/fts5al.test f0e655606771b2b5dbaf70e7f0044d560257cf3531d5eea40df58d0d7add8c39
 F ext/fts5/test/fts5alter.test ebbee06419c2d3cee5ef7ebb5ba6a9996f1aa374035361c0acd37368cc5f64f3
 F ext/fts5/test/fts5auto.test 2278de323172ced485d2844cb1357d00036ac1665f27e70fa1a48ce57bf31c2c
-F ext/fts5/test/fts5aux.test 27210687338133b1e9bc0dd669322fca59fd432439f40b126895e2d7c2f899d6
+F ext/fts5/test/fts5aux.test b1b63c5f2d176c22992a6b41e014bf51ed7f5ee9567dca1152dc177f2ca9ea55
 F ext/fts5/test/fts5aux2.test 4f59ac5e7c06c430a9f4890877e10f7b4708e46897422ee6743d27b0a8d01497
 F ext/fts5/test/fts5auxdata.test 372549088ff792655f73e62b9dfaf4863ce74f5e604c06cffec0b37ce4624161
 F ext/fts5/test/fts5bigid.test 2860854c2561a57594192b00c33a29f91cb85e25f3d6c03b5c2b8f62708f39dd
@@ -2213,8 +2213,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 46c2476b1074fb56c54068dcc04cac5a3b9da3a25bc0d3b95c00439e63d6ec43
-R 614f120796fe27e8f43757a43c2fcb46
+P 0bfba3824f3d4c136db8479c97bd789fa0df7c86ba95bd0f011c569004be2166
+R 5058ab107d87f08c2ffa1cdfde5ddf10
 U dan
-Z 4a1140244b5691488c0ec857a764c5c3
+Z e1bf6439edecbab962bcd3e56ea252b7
 # Remove this line to create a well-formed Fossil manifest.
index 8463c0cfc21d641c07c8250757e51abac0f7b343..e25781967303e802690820bb5cb096e264e92b07 100644 (file)
@@ -1 +1 @@
-0bfba3824f3d4c136db8479c97bd789fa0df7c86ba95bd0f011c569004be2166
+aeb85fdfca0a546cfd3ef26efd58b9ffc8d5fda15562558d8479dee55321596f