]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with fts5 secure-delete mode causing fts5 to corrupt its records.
authordan <Dan Kennedy>
Fri, 8 Sep 2023 19:32:48 +0000 (19:32 +0000)
committerdan <Dan Kennedy>
Fri, 8 Sep 2023 19:32:48 +0000 (19:32 +0000)
FossilOrigin-Name: cc0f82a480a400c670ae1d4193007640056bd545aed75613c088d5869a3fc817

ext/fts5/fts5_index.c
ext/fts5/test/fts5secure.test
manifest
manifest.uuid

index 25ba2a9f906b3d5f747fc3a0595359c1f03b88dc..057524a44d382d09b187515d38c883d071024d34 100644 (file)
@@ -4711,7 +4711,6 @@ static void fts5DoSecureDelete(
   int iIdx = 0;
   int iStart = 0;
   int iKeyOff = 0;
-  int iPrevKeyOff = 0;
   int iDelKeyOff = 0;       /* Offset of deleted key, if any */
 
   nIdx = nPg-iPgIdx;
@@ -4895,26 +4894,24 @@ static void fts5DoSecureDelete(
     }
 
     if( p->rc==SQLITE_OK ){
-      const int nMove = nPg - iNextOff;
-      int nShift = 0;
+      const int nMove = nPg - iNextOff;     /* Number of bytes to move */
+      int nShift = iNextOff - iOff;         /* Distance to move them */
+      int iPrevKeyOut = 0;
+      int iKeyIn = 0;
 
       memmove(&aPg[iOff], &aPg[iNextOff], nMove);
-      iPgIdx -= (iNextOff - iOff);
+      iPgIdx -= nShift;
       nPg = iPgIdx;
       fts5PutU16(&aPg[2], iPgIdx);
 
-      nShift = iNextOff - iOff;
-      for(iIdx=0, iKeyOff=0, iPrevKeyOff=0; iIdx<nIdx; /* no-op */){
+      for(iIdx=0; iIdx<nIdx; /* no-op */){
         u32 iVal = 0;
         iIdx += fts5GetVarint32(&aIdx[iIdx], iVal);
-        iKeyOff += iVal;
-        if( iKeyOff!=iDelKeyOff ){
-          if( iKeyOff>iOff ){
-            iKeyOff -= nShift;
-            nShift = 0;
-          }
-          nPg += sqlite3Fts5PutVarint(&aPg[nPg], iKeyOff - iPrevKeyOff);
-          iPrevKeyOff = iKeyOff;
+        iKeyIn += iVal;
+        if( iKeyIn!=iDelKeyOff ){
+          int iKeyOut = (iKeyIn - (iKeyIn>iOff ? nShift : 0));
+          nPg += sqlite3Fts5PutVarint(&aPg[nPg], iKeyOut - iPrevKeyOut);
+          iPrevKeyOut = iKeyOut;
         }
       }
 
index 50d84cef796e91a0b3dc5c5f67ac72fa736676cd..7e8aea3ba7e8759819b3d71022024d47b263b22d 100644 (file)
@@ -273,6 +273,19 @@ do_execsql_test 5.3 {
 do_execsql_test 5.4 { SELECT rowid FROM t1('abc'); } 2
 do_execsql_test 5.5 { SELECT rowid FROM t1('aa'); } 2
 
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 6.0 {
+  CREATE VIRTUAL TABLE fts USING fts5(content);
+  INSERT INTO fts(fts, rank) VALUES ('secure-delete', 1);
+  INSERT INTO fts(rowid, content) VALUES
+    (3407, 'profile profile profile profile profile profile profile profile pull pulling pulling really');
+  DELETE FROM fts WHERE rowid IS 3407;
+  INSERT INTO fts(fts) VALUES ('integrity-check');
+}
+
+
 
 finish_test
 
index 0b6703a835186228d1b998013f486171d42874cc..646ab2bd146c6bb455a81fc8d56855287832b4c2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sCLI\s.sha3sum\serror\smessage\sfor\skeyword\sidentifiers,\sreported\sin\s[forum:/forumpost/7cbe081746dd|forum\spost\s7cbe081746dd].
-D 2023-06-26T17:23:53.524
+C Fix\sa\sproblem\swith\sfts5\ssecure-delete\smode\scausing\sfts5\sto\scorrupt\sits\srecords.
+D 2023-09-08T19:32:48.879
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -92,7 +92,7 @@ F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b7292
 F ext/fts5/fts5_config.c 051056a9052f5d3a4d1c695f996fd364f920e341f136c60ab2c04aa7e267113f
 F ext/fts5/fts5_expr.c 58fb8ceddfb1cefcd54510f9f2f33c220ef9d1b3fa77462111f5ae2a825ab7b1
 F ext/fts5/fts5_hash.c d4fb70940359f2120ccd1de7ffe64cc3efe65de9e8995b822cd536ff64c96982
-F ext/fts5/fts5_index.c f1ed9aed21e7b717295b2b8fa1a6b2a82f34ee604c06d6e4b540d20d6eb91133
+F ext/fts5/fts5_index.c b69a5ab71b732427900871476650e73bfeeb0dfd45c76b32df87d2415fecadf3
 F ext/fts5/fts5_main.c b4dba04a36aaf9b8e8cef0100b6dbb422cc74753eacc11d6401cac7a87c0f38d
 F ext/fts5/fts5_storage.c 76c6085239eb44424004c022e9da17a5ecd5aaec859fba90ad47d3b08f4c8082
 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
@@ -189,7 +189,7 @@ F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde4
 F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415
 F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6
 F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f
-F ext/fts5/test/fts5secure.test 214a561519d1b1817f146efd1057e2a97cc896e75c2accc77157d874154bda64
+F ext/fts5/test/fts5secure.test 833f987e6902a9ab20fabbaa7ca0662c6187fa368cbc7a8082fdf2bf22ee0304
 F ext/fts5/test/fts5secure2.test 2e961d7eef939f294c56b5d895cac7f1c3a60b934ee2cfd5e5e620bdf1ba6bbc
 F ext/fts5/test/fts5secure3.test c7e1080a6912f2a3ac68f2e05b88b72a99de38543509b2bbf427cac5c9c1c610
 F ext/fts5/test/fts5secure4.test 0d10a80590c07891478700af7793b232962042677432b9846cf7fc8337b67c97
@@ -2070,9 +2070,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b6ae84915f364f47f7cb66361dd3cb27f49d6617011077e3a4a669241a4e9dcb
-Q +9d7813ddcf67f1256e7331c5f390cb122b3f7e35cf46e0b33b610216a5396a00
-R 9a774c74c3878c9f94171cd286466429
-U larrybr
-Z 3defd247fc016eb38f2e4c6f0272d7aa
+P bc27bda164b86892b9dce1b5b6fe3513e6615e4fac6b55e69c828183eefec58d
+Q +4b60a1c358c966f161601e749ccb0a7c5f4126e20350f4d6c83b6f35841fbe0a
+R ccc05e6eb66de882b17a024c78aa7cd8
+U dan
+Z cdbabb0ba739b9ebb19c3c35d4af2c97
 # Remove this line to create a well-formed Fossil manifest.
index 138d212f27e5488f9f5854ff5f18a3da404fd8c3..ad71c619e5bf615b103598369c0e59b927d805ff 100644 (file)
@@ -1 +1 @@
-bc27bda164b86892b9dce1b5b6fe3513e6615e4fac6b55e69c828183eefec58d
\ No newline at end of file
+cc0f82a480a400c670ae1d4193007640056bd545aed75613c088d5869a3fc817
\ No newline at end of file