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();
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({
-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
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
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
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
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.
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 */
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);
pFile->isJournal ? "journal" : "db"));
sqlite3_free(pFile->aJrnl);
sqlite3_free(pFile->aData);
-#ifdef SQLITE_WASM
memset(pFile, 0, sizeof(*pFile));
-#endif
return SQLITE_OK;
}
aTxt, szTxt+1);
if( rc>=0 ){
kvvfsDecodeJournal(pFile, aTxt, szTxt);
+ rc = 0;
}
sqlite3_free(aTxt);
if( rc ) return rc;