1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Fixes for kvvfs journaling. Bug reports [bugs:20e208fe172cae4f|2026-06-20T08:49:41Z] and [bugs:76acc88b573e3a16|2026-06-20T18:35:54Z].

FossilOrigin-Name: 4c773f5d64246c7c47a569218215787ba2104bc2966c4bbd8907b936e396f6ea
This commit is contained in:
stephan
2026-06-22 10:38:03 +00:00
parent d5b7e82ccd
commit 06ca05fdfd
5 changed files with 48 additions and 26 deletions

View File

@@ -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+"."

View File

@@ -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({

View File

@@ -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.

View File

@@ -1 +1 @@
6c22c34e9a7bc7bb68680de87a73667f21d14bf201990040423afc426c23a4af
4c773f5d64246c7c47a569218215787ba2104bc2966c4bbd8907b936e396f6ea

View File

@@ -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;