Avoid a buffer overread in fts3 that could occur when handling corrupt data structures.

FossilOrigin-Name: 45f459d2fa4be97d9bbb970efbc0b5d40efaf93f52ed111fd0fcdc572c24327b
(cherry picked from commit 822810b95a680e86f92d0d9e3a659e0dda8ce6d5)

Cherry picks https://sqlite.org/src/info/45f459d2fa4be97d

Bug: 1209517
Change-Id: I63542120e068b5254e6fce9f68830052c8eb2baf
diff --git a/amalgamation/sqlite3.c b/amalgamation/sqlite3.c
index 647aff1..7f20d38 100644
--- a/amalgamation/sqlite3.c
+++ b/amalgamation/sqlite3.c
@@ -1188,7 +1188,7 @@
 */
 #define SQLITE_VERSION        "3.35.5"
 #define SQLITE_VERSION_NUMBER 3035005
-#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 9e7a11c4a75ee64b006a62512c8f39eaed02665428732fea717f0af6f847alt1"
+#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 7dd0b0cff3f06b1f1a3bc94233e1d1574288f3ed9bbc277639d2cc5713d0alt1"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
@@ -181733,8 +181733,8 @@
   int nNext                       /* Size of buffer zNext in bytes */
 ){
   int n;
-  UNUSED_PARAMETER(nNext);
-  for(n=0; n<nPrev && zPrev[n]==zNext[n]; n++);
+  for(n=0; n<nPrev && n<nNext && zPrev[n]==zNext[n]; n++);
+  assert_fts3_nc( n<nNext );
   return n;
 }
 
@@ -233739,7 +233739,7 @@
 /************** End of stmt.c ************************************************/
 #if __LINE__!=233740
 #undef SQLITE_SOURCE_ID
-#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 9e7a11c4a75ee64b006a62512c8f39eaed02665428732fea717f0af6f847alt2"
+#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 7dd0b0cff3f06b1f1a3bc94233e1d1574288f3ed9bbc277639d2cc5713d0alt2"
 #endif
 /* Return the source-id for this library */
 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
diff --git a/amalgamation/sqlite3.h b/amalgamation/sqlite3.h
index f7420b7..31e4fc4 100644
--- a/amalgamation/sqlite3.h
+++ b/amalgamation/sqlite3.h
@@ -125,7 +125,7 @@
 */
 #define SQLITE_VERSION        "3.35.5"
 #define SQLITE_VERSION_NUMBER 3035005
-#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 9e7a11c4a75ee64b006a62512c8f39eaed02665428732fea717f0af6f847alt1"
+#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 7dd0b0cff3f06b1f1a3bc94233e1d1574288f3ed9bbc277639d2cc5713d0alt1"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
diff --git a/amalgamation_dev/sqlite3.c b/amalgamation_dev/sqlite3.c
index 50eb482..8226e44 100644
--- a/amalgamation_dev/sqlite3.c
+++ b/amalgamation_dev/sqlite3.c
@@ -1188,7 +1188,7 @@
 */
 #define SQLITE_VERSION        "3.35.5"
 #define SQLITE_VERSION_NUMBER 3035005
-#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 9e7a11c4a75ee64b006a62512c8f39eaed02665428732fea717f0af6f847alt1"
+#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 7dd0b0cff3f06b1f1a3bc94233e1d1574288f3ed9bbc277639d2cc5713d0alt1"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
@@ -182244,8 +182244,8 @@
   int nNext                       /* Size of buffer zNext in bytes */
 ){
   int n;
-  UNUSED_PARAMETER(nNext);
-  for(n=0; n<nPrev && zPrev[n]==zNext[n]; n++);
+  for(n=0; n<nPrev && n<nNext && zPrev[n]==zNext[n]; n++);
+  assert_fts3_nc( n<nNext );
   return n;
 }
 
@@ -234250,7 +234250,7 @@
 /************** End of stmt.c ************************************************/
 #if __LINE__!=234251
 #undef SQLITE_SOURCE_ID
-#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 9e7a11c4a75ee64b006a62512c8f39eaed02665428732fea717f0af6f847alt2"
+#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 7dd0b0cff3f06b1f1a3bc94233e1d1574288f3ed9bbc277639d2cc5713d0alt2"
 #endif
 /* Return the source-id for this library */
 SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
diff --git a/amalgamation_dev/sqlite3.h b/amalgamation_dev/sqlite3.h
index f7420b7..31e4fc4 100644
--- a/amalgamation_dev/sqlite3.h
+++ b/amalgamation_dev/sqlite3.h
@@ -125,7 +125,7 @@
 */
 #define SQLITE_VERSION        "3.35.5"
 #define SQLITE_VERSION_NUMBER 3035005
-#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 9e7a11c4a75ee64b006a62512c8f39eaed02665428732fea717f0af6f847alt1"
+#define SQLITE_SOURCE_ID      "2021-04-19 18:32:05 7dd0b0cff3f06b1f1a3bc94233e1d1574288f3ed9bbc277639d2cc5713d0alt1"
 
 /*
 ** CAPI3REF: Run-Time Library Version Numbers
diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c
index bc42fc3..bd2f19d 100644
--- a/ext/fts3/fts3_write.c
+++ b/ext/fts3/fts3_write.c
@@ -2003,8 +2003,8 @@
   int nNext                       /* Size of buffer zNext in bytes */
 ){
   int n;
-  UNUSED_PARAMETER(nNext);
-  for(n=0; n<nPrev && zPrev[n]==zNext[n]; n++);
+  for(n=0; n<nPrev && n<nNext && zPrev[n]==zNext[n]; n++);
+  assert_fts3_nc( n<nNext );
   return n;
 }
 
diff --git a/manifest b/manifest
index db0a4d4..27be994 100644
--- a/manifest
+++ b/manifest
@@ -102,7 +102,7 @@
 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004
 F ext/fts3/fts3_unicode.c de426ff05c1c2e7bce161cf6b706638419c3a1d9c2667de9cb9dc0458c18e226
 F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f
-F ext/fts3/fts3_write.c a5159accfd88f85fd3fc2298286d7a9427a02d1ea9a52b7c79730cff7a0bc03f
+F ext/fts3/fts3_write.c 75b151c9b074c0f74f29ab4b843d1c272fd96a9e82556bca947ad2d0fc8ea41d
 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9
 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100
 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73
@@ -971,7 +971,7 @@
 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f
 F test/fts3corrupt4.test b71512ec391d39da96d60d01959e4e9f20d4237a964a94abcf5f5a2ad28378c1
 F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5
-F test/fts3corrupt6.test d5896a8d389bd824457772dc1e2d2023cd5c5cf8e42733607b5d632103018d8b
+F test/fts3corrupt6.test 938e5f118974c9169bb6ef9501b9d212e1124f2de1b5bf7e6499db870062dd9e
 F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf
 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f
 F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de
diff --git a/test/fts3corrupt6.test b/test/fts3corrupt6.test
index 5cb0a18..9db2188 100644
--- a/test/fts3corrupt6.test
+++ b/test/fts3corrupt6.test
@@ -62,6 +62,18 @@
   SELECT count(*) FROM t0 WHERE t0 MATCH '(1 NEAR 1) AND (aaaa OR 1)';
 } 1
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 3.0 {
+  CREATE VIRTUAL TABLE main.Table0 USING fts3();
+  INSERT INTO Table0 VALUES (1), (printf('%8.1280000X') ), (1), (printf('%8.1280000X') ), (1)  ;
+  INSERT INTO Table0 VALUES (0), (printf('%8.1280000X%8.1280000X') ), (1), (printf('%1280000.1280000X%#1280000.1280000E%8.1280000X') ), (1)  ;
+  INSERT INTO Table0 VALUES (1)  ;
+  UPDATE Table0_segdir SET start_block = 1;
+  INSERT INTO Table0 VALUES (1)  ;
+  INSERT INTO Table0(Table0) VALUES('merge=6,8');
+}
+
 set sqlite_fts3_enable_parentheses $saved_sqlite_fts3_enable_parentheses
 finish_test