From: stephan Date: Mon, 22 Jun 2026 10:38:03 +0000 (+0000) Subject: Fixes for kvvfs journaling. Bug reports [bugs:20e208fe172cae4f|2026-06-20T08:49:41Z... X-Git-Tag: release~23 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=06ca05fdfd33894bd470175dc07e71d7aa243e74;p=thirdparty%2Fsqlite.git Fixes for kvvfs journaling. Bug reports [bugs:20e208fe172cae4f|2026-06-20T08:49:41Z] and [bugs:76acc88b573e3a16|2026-06-20T18:35:54Z]. FossilOrigin-Name: 4c773f5d64246c7c47a569218215787ba2104bc2966c4bbd8907b936e396f6ea --- diff --git a/ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js b/ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js index 0db303bc46..99cee7f18d 100644 --- a/ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js +++ b/ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js @@ -811,10 +811,6 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ xOpen: function(pProtoVfs,zName,pProtoFile,flags,pOutFlags){ cache.popError(); let zToFree /* alloc()'d memory for temp db name */; - if( 0 ){ - /* tester1.js makes it a lot further if we do this. */ - flags |= capi.SQLITE_OPEN_CREATE; - } try{ if( !zName ){ zToFree = wasm.allocCString(""+pProtoFile+"." diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index b18d90209d..4476357495 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -3061,10 +3061,10 @@ globalThis.sqlite3InitModule = sqlite3InitModule; const JDb = sqlite3.oo1.JsStorageDb; const pVfs = capi.sqlite3_vfs_find('kvvfs'); T.assert(looksLikePtr(pVfs)); - let x = sqlite3.kvvfs.internal.storageForZClass('session'); - T.assert( 0 === x.files.length ) - .assert( globalThis.sessionStorage===x.storage ) - .assert( 'kvvfs-session-' === x.keyPrefix ); + const pStorage = sqlite3.kvvfs.internal.storageForZClass('session'); + T.assert( 0 === pStorage.files.length ) + .assert( globalThis.sessionStorage===pStorage.storage ) + .assert( 'kvvfs-session-' === pStorage.keyPrefix ); const filename = this.kvvfsDbFile = 'session'; const unlink = this.kvvfsUnlink = ()=>sqlite3.kvvfs.clear(filename); unlink(); @@ -3082,9 +3082,30 @@ globalThis.sqlite3InitModule = sqlite3InitModule; db.exec('insert into kvvfs(a) values(4),(5),(6)'); T.assert(6 === db.selectValue('select count(*) from kvvfs')); }finally{ - if( db ) db.close(); + if( db ){ + db.close(); + db = null; + } } //console.debug("sessionStorage",globalThis.sessionStorage); + const corruptJrnl = [ + /* Test that it recovers properly from a bad journal: + https://sqlite.org/bugs/forumpost/20e208fe172cae4f */ + pStorage.keyPrefix+'jrnl', + 'cb d9d505f920a163d7ffffffffdeadbeef000000010000020000001000' + ]; + sessionStorage.setItem(...corruptJrnl); + //console.debug("sessionStorage",globalThis.sessionStorage); + T.assert( corruptJrnl[1] === sessionStorage.getItem(corruptJrnl[0]) ); + try{ + db = new JDb(filename); + T.assert(6 === db.selectValue('select count(*) from kvvfs')); + db.exec('insert into kvvfs(a) values(7),(8),(9)'); + T.assert(9 === db.selectValue('select count(*) from kvvfs')); + T.assert( corruptJrnl[1] !== sessionStorage.getItem(corruptJrnl[0]) ); + }finally{ + if( db ) db.close(); + } } }/*kvvfs sanity checks*/) .t({ diff --git a/manifest b/manifest index b6decfdd2a..24766b68f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scast\sin\sfts3_write\sso\sthat\sit\sis\sapplied\sas\sintended. -D 2026-06-19T12:14:55.535 +C Fixes\sfor\skvvfs\sjournaling.\sBug\sreports\s[bugs:20e208fe172cae4f|2026-06-20T08:49:41Z]\sand\s[bugs:76acc88b573e3a16|2026-06-20T18:35:54Z]. +D 2026-06-22T10:38:03.366 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -599,7 +599,7 @@ F ext/wasm/api/sqlite3-api-worker1.c-pp.js 1fa34e9b0e3b90a8898e4f700d7125e44c818 F ext/wasm/api/sqlite3-license-version-header.js 98d90255a12d02214db634e041c8e7f2f133d9361a8ebf000ba9c9af4c6761cc F ext/wasm/api/sqlite3-opfs-async-proxy.c-pp.js 25e31482b04293a33d7599f1459eb552b3eb36ca10c02c816122d3308bf80cb2 F ext/wasm/api/sqlite3-vfs-helper.c-pp.js 3f828cc66758acb40e9c5b4dcfd87fd478a14c8fb7f0630264e6c7fa0e57515d -F ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js 27fb135ba3b805b66c90a7333b56080345bf1db79335c3e48b6d01ad7aa09607 +F ext/wasm/api/sqlite3-vfs-kvvfs.c-pp.js 96f79583dc12f836eadf3c6430a0beaed859306b67e8fd7b0fada8d22cc2393f F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 1c742ed92c0515c8ef97d2b132feb01168252bfd847fed5d52607d8a42d23c6a F ext/wasm/api/sqlite3-vfs-opfs-wl.c-pp.js 3dbd918ef037cd8fa9c7b4dccb3c8637b228638654c429e7df6acab5981c75e2 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 3da8fe72dc9e76614a9c102b92e777ce03f81d788b607701c828d8fcbac44b06 @@ -647,7 +647,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.c-pp.html 7171022e7f4da8f46e5f50ea81dd6ce840b9235c47653a5deeb3764ccc2fe472 F ext/wasm/tester1.c-pp.html bd927ccf51ddd65e924660a0487add99e1b044afe03950e49d87ccf44efdddb6 -F ext/wasm/tester1.c-pp.js 54ce4a08d3752cb52cf60926d7da47a21ae63d620f90679770dd9c04002722b4 +F ext/wasm/tester1.c-pp.js c4e2bc6be2544c9fee05f68fdc6a656d17d63026683ce02488f93820c716f9a7 F ext/wasm/tests/opfs/concurrency/index.html 706eab6308343c04ac2360aba6001af4ffaf46d8f33a0ccd02c64d93e3216a43 F ext/wasm/tests/opfs/concurrency/test.js 6919778fceaac1b7cc78caf41d796f545d2c4433b31188aa9689f05b5ad28828 F ext/wasm/tests/opfs/concurrency/worker.js 704d82c5e287e47f612349e027765943a58ad967dcf178fb5a1c3a8eaafb09af @@ -718,7 +718,7 @@ F src/notify.c 57c2d1a2805d6dee32acd5d250d928ab94e02d76369ae057dee7d445fd64e878 F src/os.c 509452169d5ea739723e213b8e2481cf0e587f0e88579a912d200db5269f5f6d F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06 -F src/os_kv.c e7d96727db5b67e39d590a68cc61c86daf4c093c36c011a09ebfb521182ec28d +F src/os_kv.c af5bfb3d373e8d00f0d87da57fec87ae940ce59c080c56ee4fdc1e56a9044bb3 F src/os_setup.h 8efc64eda6a6c2f221387eefc2e7e45fd5a3d5c8337a7a83519ba4fbd2957ae2 F src/os_unix.c 92a1773139e0c6206a927c7e1648b06287583570b6e253210a06ee3886739d39 F src/os_win.c d8c82024ac9d96ea182e7a5c346612f0ec2a9eeebe896a58725153581fd385c7 @@ -2200,9 +2200,14 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 4d993e8f5ffe4d34d4b1c579f9d50b60be6a3c6738e1c06d298e43b1222f7a66 -Q +d6a3272e5592bcfeecf8a06dd8330cce57ff6603b24994b533d1fdcd48b5dc66 -R 7476e4ce806d2a8705d08d4dc3ef7709 -U drh -Z 4b94bca588873853dba2729cc7564b29 +P 6c22c34e9a7bc7bb68680de87a73667f21d14bf201990040423afc426c23a4af +Q +7c4db1cd2d06d9dc6c4b5eed5c4fc0fc5466128a169a5d4ba261e0cb17020ae1 +Q +96a48a15760a2eee2642926874e9dfd4082518c6669f930fcc367ffd16669f39 +Q +a396d7c54c5f251daaaac1e68321c2a54d3b6969599027c29b7ca7abe7fb8c4e +Q +bd6bbd0e84226c90d864c28ac4d6acd908c4f06bfe63dcfd6fa6b8d17105b338 +Q +c36fc5df62c7eb8fca6a43cb0b3154a030b39a4cfade8fb04496120d4d339b97 +Q +c9171221160f241b450d425f41bb53b42362dccfad4c3fdf64dd5c3562ed4096 +R cf621caee52cc74f8ce2c282ffe08d08 +U stephan +Z 480f67db0bf2e95783b20a7e3e648f93 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 65c5e719ff..8397bfcd78 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6c22c34e9a7bc7bb68680de87a73667f21d14bf201990040423afc426c23a4af +4c773f5d64246c7c47a569218215787ba2104bc2966c4bbd8907b936e396f6ea diff --git a/src/os_kv.c b/src/os_kv.c index 1fd1c8e8ce..5ec79b13dd 100644 --- a/src/os_kv.c +++ b/src/os_kv.c @@ -452,16 +452,17 @@ int kvvfsDecode(const char *a, char *aOut, int nOut){ while( 1 ){ c = kvvfsHexValue[aIn[i]]; if( c<0 ){ - int n = 0; - int mult = 1; + sqlite3_int64 n = 0; + sqlite3_int64 mult = 1; c = aIn[i]; if( c==0 ) break; while( c>='a' && c<='z' ){ n += (c - 'a')*mult; + if( n>nOut ) return -1 /* oversized/malformed input */; mult *= 26; c = aIn[++i]; } - if( j+n>nOut ) return -1; + if( j+n>nOut ) return -1 /* oversized/malformed input */; memset(&aOut[j], 0, n); j += n; if( c==0 || mult==1 ) break; /* progress stalled if mult==1 */ @@ -497,7 +498,7 @@ static void kvvfsDecodeJournal( i = 0; mult = 1; while( (c = zTxt[i++])>='a' && c<='z' ){ - n += (zTxt[i] - 'a')*mult; + n += (c - 'a')*mult; mult *= 26; } sqlite3_free(pFile->aJrnl); @@ -543,9 +544,7 @@ static int kvvfsClose(sqlite3_file *pProtoFile){ pFile->isJournal ? "journal" : "db")); sqlite3_free(pFile->aJrnl); sqlite3_free(pFile->aData); -#ifdef SQLITE_WASM memset(pFile, 0, sizeof(*pFile)); -#endif return SQLITE_OK; } @@ -575,6 +574,7 @@ static int kvvfsReadJrnl( aTxt, szTxt+1); if( rc>=0 ){ kvvfsDecodeJournal(pFile, aTxt, szTxt); + rc = 0; } sqlite3_free(aTxt); if( rc ) return rc;