char computeCksm; /* True to compute checksums.
** Always true if reserve size is 8. */
char verifyCksm; /* True to verify checksums */
- char isWal; /* True if processing a WAL file */
- char inCkpt; /* Currently doing a checkpoint */
CksmFile *pPartner; /* Ptr from WAL to main-db, or from main-db to WAL */
};
pFile = ORIGFILE(pFile);
rc = pFile->pMethods->xRead(pFile, zBuf, iAmt, iOfst);
if( rc==SQLITE_OK ){
- assert( iAmt==100 || (iAmt & (iAmt-1))==0 );
if( iOfst==0 && iAmt>=100 && (
memcmp(zBuf,"SQLite format 3",16)==0 || memcmp(zBuf,"ZV-",3)==0
)){
** (1) the size indicates that we are dealing with a complete
** database page
** (2) checksum verification is enabled
- ** (3) we are not in the middle of checkpoint
*/
- if( iAmt>=512 /* (1) */
+ if( iAmt>=512 && (iAmt & (iAmt-1))==0 /* (1) */
&& p->verifyCksm /* (2) */
- && !p->inCkpt /* (3) */
){
u8 cksum[8];
cksmCompute((u8*)zBuf, iAmt-8, cksum);
*/
if( iAmt>=512
&& p->computeCksm
- && !p->inCkpt
){
cksmCompute((u8*)zBuf, iAmt-8, ((u8*)zBuf)+iAmt-8);
}
/* Do not allow page size changes on a checksum database */
return SQLITE_OK;
}
- }else if( op==SQLITE_FCNTL_CKPT_START || op==SQLITE_FCNTL_CKPT_DONE ){
- p->inCkpt = op==SQLITE_FCNTL_CKPT_START;
- if( p->pPartner ) p->pPartner->inCkpt = p->inCkpt;
- }else if( op==SQLITE_FCNTL_CKSM_FILE ){
- /* This VFS needs to obtain a pointer to the corresponding database
- ** file handle from within xOpen() calls to open wal files. To do this,
- ** it uses the sqlite3_database_file_object() API to obtain a pointer
- ** to the file-handle used by SQLite to access the db file. This is
- ** fine if cksmvfs happens to be the top-level VFS, but not if there
- ** are one or more wrapper VFS. To handle this case, this file-control
- ** is used to extract the cksmvfs file-handle from any wrapper file
- ** handle. */
- sqlite3_file **ppFile = (sqlite3_file**)pArg;
- *ppFile = (sqlite3_file*)p;
- return SQLITE_OK;
}
rc = pFile->pMethods->xFileControl(pFile, op, pArg);
if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){
sqlite3_vfs *pSubVfs;
int rc;
pSubVfs = ORIGVFS(pVfs);
- if( (flags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_WAL))==0 ){
+ if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){
return pSubVfs->xOpen(pSubVfs, zName, pFile, flags, pOutFlags);
}
p = (CksmFile*)pFile;
pFile->pMethods = &cksm_io_methods;
rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
if( rc ) goto cksm_open_done;
- if( flags & SQLITE_OPEN_WAL ){
- sqlite3_file *pDb = sqlite3_database_file_object(zName);
- rc = pDb->pMethods->xFileControl(pDb, SQLITE_FCNTL_CKSM_FILE, (void*)&pDb);
- assert( rc==SQLITE_OK );
- p->pPartner = (CksmFile*)pDb;
- assert( p->pPartner->pPartner==0 );
- p->pPartner->pPartner = p;
- p->isWal = 1;
- p->computeCksm = p->pPartner->computeCksm;
- }else{
- p->isWal = 0;
- p->computeCksm = 0;
- }
p->zFName = zName;
cksm_open_done:
if( rc ) pFile->pMethods = 0;
*/
static int cksmRegisterVfs(void){
int rc = SQLITE_OK;
- sqlite3_vfs *pOrig;
- if( sqlite3_vfs_find("cksmvfs")!=0 ) return SQLITE_OK;
- pOrig = sqlite3_vfs_find(0);
+ sqlite3_vfs *pOrig = sqlite3_vfs_find(0);
if( pOrig==0 ) return SQLITE_ERROR;
cksm_vfs.iVersion = pOrig->iVersion;
cksm_vfs.pAppData = pOrig;
-C Minor\sautosetup/README.md\stweaks.
-D 2025-08-13T18:30:42.027
+C In\scksumvfs,\sdo\snot\swrite\schecksums\sto\sthe\swal\sfile,\sas\sthis\sprevents\srecovery\sfrom\sworking.
+D 2025-08-13T18:37:41.105
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F ext/misc/btreeinfo.c 8f5e6da2c82ec2f06ee0216e922370a436dafdbb06ffa7a552203515ff9e7ddf
F ext/misc/carray.c 34fac63770971611c5285de0a9f0ac67d504eaf66be891f637add9290f1c76a5
F ext/misc/carray.h 503209952ccf2431c7fd899ebb92bf46bf7635b38aace42ec8aa1b8d7b6e98a5
-F ext/misc/cksumvfs.c 077e7a556c2c79a0b4db3a5dc449cdf25541860f669f359e5bd965b6f5950649
+F ext/misc/cksumvfs.c 9d7d0cf1a8893ac5d48922bfe9f3f217b4a61a6265f559263a02bb2001259913
F ext/misc/closure.c 5559daf1daf742228431db929d1aa86dd535a4224cc634a81d2fd0d1e6ad7839
F ext/misc/completion.c c3c8b3cc1293c34f04f8746a3adfbfedb43f00d113f8c984a1ed09433317e507
F ext/misc/compress.c 2c79a74330e0e0ba6cb3f7397f8ba5af12d46377ef5d3ee075e12dd8a6ed57f0
F test/check.test 3a7972ccbaad80d496833da8714d69d9d5d4ce9e7211af1cd2a06ae488a7de12
F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014
F test/chunksize.test faea11c5d6df9d392252a8dd879e1b1d68c9d3e8b7909cbed8bcec3b60c706f1
-F test/cksumvfs.test ec349149fbda923feb93e61a16674b6355b9ff6997f70c9e8f3b7843c51ea2af
+F test/cksumvfs.test c2eed4708fae44777607425ba369b642401c3771cc354d5af296ce6aab21c1c9
F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c
F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0
F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 3b06d1c9b6c03f38029a8b98fef6253647878c0f8b05447ec0c8122f189c90dc
-R 48d5cc70c03a653161ab38251c85b829
-U stephan
-Z 136f0cc4707441ee6428a1013d4e4c6d
+P bd7530bf6afdad391b223651632e1b4d59ab5ec806c7a94daadc7f09091321f4
+R 4b1ff55a2a7c8f094813855173a6bb4c
+T *branch * cksumvfs-wal-fix
+T *sym-cksumvfs-wal-fix *
+T -sym-trunk *
+U dan
+Z 27676fcaac1fda11b5c8129e0f7f8f20
# Remove this line to create a well-formed Fossil manifest.