]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a segfault in fts5 that could occur if the database contents were corrupt.
authordan <dan@noemail.net>
Thu, 10 Sep 2015 16:19:01 +0000 (16:19 +0000)
committerdan <dan@noemail.net>
Thu, 10 Sep 2015 16:19:01 +0000 (16:19 +0000)
FossilOrigin-Name: 4931e37da4d2c26d7afc5432f7f0d534b51a85fa

ext/fts5/fts5_index.c
ext/fts5/test/fts5corrupt.test
ext/fts5/test/fts5corrupt2.test
manifest
manifest.uuid

index 3a70baf5a249df0e4fa357e14713811d1870dccf..cd3402418c3a2a9f7f2089a5b736a891f46d826b 100644 (file)
@@ -3970,7 +3970,10 @@ static void fts5PoslistCallback(
   void *pCtx, 
   const u8 *pChunk, int nChunk
 ){
-  fts5BufferAppendBlob(&p->rc, (Fts5Buffer*)pCtx, nChunk, pChunk);
+  assert_nc( nChunk>=0 );
+  if( nChunk>0 ){
+    fts5BufferAppendBlob(&p->rc, (Fts5Buffer*)pCtx, nChunk, pChunk);
+  }
 }
 
 /*
index 3f57eb515a523c8339667e2dc93b4ddf7ec386e2..edaafb23793c1527318534ebd194ca15726b2d9c 100644 (file)
@@ -43,7 +43,7 @@ set segid [lindex [fts5_level_segids t1] 0]
 
 do_test 1.3 {
   execsql {
-    DELETE FROM t1_data WHERE rowid = fts5_rowid('segment', $segid, 0, 4);
+    DELETE FROM t1_data WHERE rowid = fts5_rowid('segment', $segid, 4);
   }
   catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
 } {1 {database disk image is malformed}}
@@ -52,7 +52,7 @@ do_test 1.4 {
   db_restore_and_reopen
   execsql {
     UPDATE t1_data set block = X'00000000' || substr(block, 5) WHERE
-    rowid = fts5_rowid('segment', $segid, 0, 4);
+    rowid = fts5_rowid('segment', $segid, 4);
   }
   catchsql { INSERT INTO t1(t1) VALUES('integrity-check') }
 } {1 {database disk image is malformed}}
index 3e8323b984ee51682161847679c1fc16a56ef0cc..3a4fcfaaedd81ae7bdac59a105a3135dbe2f5c71 100644 (file)
@@ -209,13 +209,13 @@ foreach {tn nCut} {
     execsql ROLLBACK
   }
 
-  do_test 4.$tn.x { expr $nCorrupt>0 } 1
+  do_test 4.$tn.x { expr $nCorrupt>0 } 1
 }
 
 }
 
 set doc [string repeat "A B C " 1000]
-do_execsql_test 4.0 {
+do_execsql_test 5.0 {
   CREATE VIRTUAL TABLE x5 USING fts5(tt);
   INSERT INTO x5(x5, rank) VALUES('pgsz', 32);
   WITH ii(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM ii WHERE i<10) 
@@ -230,7 +230,7 @@ foreach {tn hdr} {
   foreach rowid [db eval {SELECT rowid FROM x5_data WHERE rowid>10}] {
     if {$rowid & $mask} continue
     incr tn2
-    do_test 4.$tn.$tn2 {
+    do_test 5.$tn.$tn2 {
       execsql BEGIN
 
       set fd [db incrblob main x5_data block $rowid]
@@ -248,7 +248,7 @@ foreach {tn hdr} {
 
 #--------------------------------------------------------------------
 reset_db
-do_execsql_test 5.1 {
+do_execsql_test 6.1 {
   CREATE VIRTUAL TABLE x5 USING fts5(tt);
   INSERT INTO x5 VALUES('a');
   INSERT INTO x5 VALUES('a a');
@@ -262,7 +262,7 @@ proc colsize {cmd i} {
 }
 sqlite3_fts5_create_function db colsize colsize
 
-do_catchsql_test 5.2 {
+do_catchsql_test 6.2 {
   SELECT colsize(x5, 0) FROM x5 WHERE x5 MATCH 'a'
 } {1 SQLITE_CORRUPT_VTAB}
 
index 135394a387b62547649b090ff2773e5241de5cd8..b51eb758c452c3c0138555303b465b6b0a02ff6c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\slatest\schanges\sfrom\strunk.\sIncluding\sfts5_expr.c\sfixes.
-D 2015-09-10T15:52:42.491
+C Fix\sa\ssegfault\sin\sfts5\sthat\scould\soccur\sif\sthe\sdatabase\scontents\swere\scorrupt.
+D 2015-09-10T16:19:01.581
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c 64dcaf36a3ebda9e84b7c3b8788887ec325e12a4
 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695
 F ext/fts5/fts5_expr.c a7726fe7045eec7caca8a074af747c8ea3545b83
 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246
-F ext/fts5/fts5_index.c bd2b6e63c1ed8329176d73a9491023eaf06c572f
+F ext/fts5/fts5_index.c 093e2e5936dab536cbe3e321bf4b53dda2b40547
 F ext/fts5/fts5_main.c 4b04c934084ea24a858438a04b5be8af3a9e0311
 F ext/fts5/fts5_storage.c 120f7b143688b5b7710dacbd48cff211609b8059
 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37
@@ -144,8 +144,8 @@ F ext/fts5/test/fts5bigpl.test 04ee0d7eebbebf17c31f5a0b5c5f9494eac3a0cb
 F ext/fts5/test/fts5columnsize.test a8cfef21ffa1c264b9f670a7d94eeaccb5341c07
 F ext/fts5/test/fts5config.test ad2ff42ddc856aed2d05bf89dc1c578c8a39ea3b
 F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1
-F ext/fts5/test/fts5corrupt.test 928c9c91d40690d301f943a7ed0ffc19e0d0e7b6
-F ext/fts5/test/fts5corrupt2.test 1a830ccd6dbe1b601c7e3f5bbc1cf77bd8c8803b
+F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62
+F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c
 F ext/fts5/test/fts5corrupt3.test 1ccf575f5126e79f9fec7979fd02a1f40a076be3
 F ext/fts5/test/fts5dlidx.test 59b80bbe34169a082c575d9c26f0a7019a7b79c1
 F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b
@@ -1385,7 +1385,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 85aac7b8b6731e2f6880b80cfd62d431ea059799 47a46a9fa4a96cdb96a20b6aec802661b1ee4598
-R c5f7ba1eb5032deaf906327db459f6d6
+P 716e7e747714d6af502f6a87ca8d789bb7ce162a
+R 635eaf5cd920b80fc2d9c9be975e5caf
 U dan
-Z 7d64753f9bb762353618192be20f88c2
+Z e0d8c3d69e3d58e6c9e4d77310051289
index 30fcdc4197f2f63946eea6526c43203593b14836..82e41d2242f3b6a552970bcdb6fb6b678b216b8a 100644 (file)
@@ -1 +1 @@
-716e7e747714d6af502f6a87ca8d789bb7ce162a
\ No newline at end of file
+4931e37da4d2c26d7afc5432f7f0d534b51a85fa
\ No newline at end of file