From 240c5795d54ee6730c6a19d72b539f3b878926e5 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 8 Feb 2004 00:40:52 +0000 Subject: [PATCH] Preliminary fix for ticket #599. More testing and analysis needed. (CVS 1208) FossilOrigin-Name: dc5be2c82b591a385adf02863d89e113272e2ebd --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 20 +++++++++++++++++--- tool/showjournal.c | 19 ++++++++++++++++--- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 727e589a45..bdab6c2eea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sundocumented\sextensions\sfrom\ssqlite_mprintf()\sand\sfriends\sin\sorder\sto\nmake\sit\sabout\s10%\ssmaller.\s(CVS\s1207) -D 2004-02-02T12:29:25 +C Preliminary\sfix\sfor\sticket\s#599.\s\sMore\stesting\sand\sanalysis\sneeded.\s(CVS\s1208) +D 2004-02-08T00:40:52 F Makefile.in 0515ff9218ad8d5a8f6220f0494b8ef94c67013b F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -40,7 +40,7 @@ F src/main.c 808ea1bda0798f4a714479aee8289d65f04cf29b F src/md5.c fe4f9c9c6f71dfc26af8da63e4d04489b1430565 F src/os.c 681ec36217bc7c795d55d9a63ff79a8614ddee8c F src/os.h 8d02b622153d2df442da1ec37cdd6b1bd9804a25 -F src/pager.c 289328d8efba620eae99f6c2f6062710838a3eb4 +F src/pager.c 7872537f9f47339b2a1098a54101d7f4e4c25364 F src/pager.h 5da62c83443f26b1792cfd72c96c422f91aadd31 F src/parse.y 7a121554c0c0c0150a77ab05417b01fa44813ac4 F src/pragma.c 89d62c31c6f0a43376fe8d20549b87a6d30c467a @@ -153,7 +153,7 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c F tool/report1.txt 9eae07f26a8fc53889b45fc833a66a33daa22816 F tool/showdb.c 3559eac5a3b46e9b558d50856946b25e77633236 -F tool/showjournal.c 9a37d7b05de0591e3102aaf774d01fbc0d053a8b +F tool/showjournal.c ec3b171be148656827c4949fbfb8ab4370822f87 F tool/space_used.tcl f714c41a59e326b8b9042f415b628b561bafa06b F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff @@ -182,7 +182,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P 3c796de8d1af55944f396f08feaa9e69c1652896 -R eeb1a65670905e806f11ab1b63f5e8e7 +P 0b3f552b986fd89c48c350b0746be93b9d276ecc +R 753fd39b58050d194e71064713a576ce U drh -Z f7f5c0bf32582b04f90ec08e5433a558 +Z 12eaf8d85a0609bf96a6d19c712cf69b diff --git a/manifest.uuid b/manifest.uuid index 6d0289d0d4..af1e994767 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b3f552b986fd89c48c350b0746be93b9d276ecc \ No newline at end of file +dc5be2c82b591a385adf02863d89e113272e2ebd \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 605dc0d320..589a885f00 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.92 2004/01/07 02:52:08 drh Exp $ +** @(#) $Id: pager.c,v 1.93 2004/02/08 00:40:52 drh Exp $ */ #include "os.h" /* Must be first to enable large file support */ #include "sqliteInt.h" @@ -571,6 +571,10 @@ static int pager_playback(Pager *pPager, int useJournalSize){ if( rc!=SQLITE_OK ){ goto end_playback; } + + /* If the journal file is too small to contain a complete header, + ** then ignore the journal completely. + */ if( szJ < sizeof(aMagic)+sizeof(Pgno) ){ goto end_playback; } @@ -594,6 +598,15 @@ static int pager_playback(Pager *pPager, int useJournalSize){ goto end_playback; } if( format>=JOURNAL_FORMAT_3 ){ + if( szJ < sizeof(aMagic) + 3*sizeof(u32) ){ + /* Ignore the journal if it is too small to contain a complete + ** header. We already did this test once above, but at the prior + ** test, we did not know the journal format and so we had to assume + ** the smallest possible header. Now we know the header is bigger + ** than that so we test again. + */ + goto end_playback; + } rc = read32bits(format, &pPager->jfd, (u32*)&nRec); if( rc ) goto end_playback; rc = read32bits(format, &pPager->jfd, &pPager->cksumInit); @@ -630,7 +643,7 @@ static int pager_playback(Pager *pPager, int useJournalSize){ /* Pages that have been written to the journal but never synced ** where not restored by the loop above. We have to restore those - ** pages by reading the back from the original database. + ** pages by reading them back from the original database. */ if( rc==SQLITE_OK ){ PgHdr *pPg; @@ -1896,7 +1909,8 @@ int sqlitepager_commit(Pager *pPager){ return rc; } assert( pPager->journalOpen ); - if( pPager->needSync && sqliteOsSync(&pPager->jfd)!=SQLITE_OK ){ + rc = syncAllPages(pPager); + if( rc!=SQLITE_OK ){ goto commit_abort; } pPg = pager_get_all_dirty_pages(pPager); diff --git a/tool/showjournal.c b/tool/showjournal.c index 5621f5b82c..ec93c91905 100644 --- a/tool/showjournal.c +++ b/tool/showjournal.c @@ -43,7 +43,8 @@ int main(int argc, char **argv){ struct stat sbuf; unsigned int u; int rc; - char zBuf[100]; + unsigned char zBuf[10]; + unsigned char zBuf2[sizeof(u)]; if( argc!=2 ){ fprintf(stderr,"Usage: %s FILENAME\n", argv[0]); exit(1); @@ -54,10 +55,22 @@ int main(int argc, char **argv){ exit(1); } read(db, zBuf, 8); - read(db, &u, sizeof(u)); + if( zBuf[7]==0xd6 ){ + read(db, &u, sizeof(u)); + printf("Records in Journal: %u\n", u); + read(db, &u, sizeof(u)); + printf("Magic Number: 0x%08x\n", u); + } + read(db, zBuf2, sizeof(zBuf2)); + u = zBuf2[0]<<24 | zBuf2[1]<<16 | zBuf2[2]<<8 | zBuf2[3]; printf("Database Size: %u\n", u); - while( read(db, &u, sizeof(u))==sizeof(u) ){ + while( read(db, zBuf2, sizeof(zBuf2))==sizeof(zBuf2) ){ + u = zBuf2[0]<<24 | zBuf2[1]<<16 | zBuf2[2]<<8 | zBuf2[3]; print_page(u); + if( zBuf[7]==0xd6 ){ + read(db, &u, sizeof(u)); + printf("Checksum: 0x%08x\n", u); + } } close(db); }