diff --git a/manifest b/manifest index 71b2dc340d..4802010dde 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C SUM\sreturns\sNULL\swhen\sit\shas\sno\sinputs.\s\sTicket\s#1413.\s(CVS\s2678) -D 2005-09-08T20:37:43 +C Defend\sagainst\sdisk\sI/O\serrors\sthat\shappen\sduring\san\ssqlite3OsSeek().\s(CVS\s2679) +D 2005-09-09T01:32:06 F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1 F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -52,11 +52,11 @@ F src/os.h c9fd9f92f176a5ea22e0101fcc1e85d532844dd1 F src/os_common.h 0e7f428ba0a6c40a61bc56c4e96f493231301b73 F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3 -F src/os_unix.c 4838fab463f7753cfa5f605091eb017eb3664600 +F src/os_unix.c c86cf43b7ca9200e6fb7bc202ad2cc7da2f69367 F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e -F src/os_win.c 6a80f6864cab2256a8e52b98f79d4e15a4b6004e +F src/os_win.c 5771f4b7d20b03b26ae332404cc58c088ef1b010 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b -F src/pager.c bf7e0df511e4cd752f56a7fb24b23383f6e35782 +F src/pager.c 2b48db1cc6073a6d2577100866db6ae039d20940 F src/pager.h 17b13225abd93c1e9f470060f40a21b9edb5a164 F src/parse.y 4c0cf6b0646166b232693249b89e32a75c6f87d7 F src/pragma.c 69413fbdc0c6aaa493a776ea52c1b3e6cf35dfb2 @@ -306,7 +306,7 @@ F www/tclsqlite.tcl 3df553505b6efcad08f91e9b975deb2e6c9bb955 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 2e6230edfd651b40481ebad8aa01a22ac92ce80c -R a88a293bb05baabbecb6ecb073a9f526 +P 6281859425d39c11d82875301fefafad1f08416d +R b07aee02e83584082249023aa692499c U drh -Z d9f9df11ed266877677e4103d7412fad +Z 11dbc78d82810ff4ae0a68e460fdaf1a diff --git a/manifest.uuid b/manifest.uuid index 85716b801c..e355d64c54 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6281859425d39c11d82875301fefafad1f08416d \ No newline at end of file +461e3a0a27ff083b0bae10c9880e3b41bb85ee31 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 2f2303173c..959e2a6816 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -772,6 +772,9 @@ int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){ int sqlite3OsSeek(OsFile *id, i64 offset){ assert( id->isOpen ); SEEK(offset/1024 + 1); +#ifdef SQLITE_TEST + if( offset ) SimulateDiskfullError +#endif lseek(id->h, offset, SEEK_SET); return SQLITE_OK; } diff --git a/src/os_win.c b/src/os_win.c index 8639ef2db0..b2fda66b47 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -473,6 +473,9 @@ int sqlite3OsSeek(OsFile *id, i64 offset){ LONG lowerBits = offset & 0xffffffff; DWORD rc; assert( id->isOpen ); +#ifdef SQLITE_TEST + if( offset ) SimulateDiskfullError +#endif SEEK(offset/1024 + 1); rc = SetFilePointer(id->h, lowerBits, &upperBits, FILE_BEGIN); TRACE3("SEEK %d %lld\n", id->h, offset); diff --git a/src/pager.c b/src/pager.c index 9b852385bd..d898d029d8 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.211 2005/09/08 12:38:42 drh Exp $ +** @(#) $Id: pager.c,v 1.212 2005/09/09 01:32:06 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -657,8 +657,10 @@ static int writeJournalHdr(Pager *pPager){ ** file descriptor to the end of the journal header sector. */ if( rc==SQLITE_OK ){ - sqlite3OsSeek(&pPager->jfd, pPager->journalOff-1); - rc = sqlite3OsWrite(&pPager->jfd, "\000", 1); + rc = sqlite3OsSeek(&pPager->jfd, pPager->journalOff-1); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(&pPager->jfd, "\000", 1); + } } return rc; } @@ -1038,8 +1040,10 @@ static int pager_playback_one_page(Pager *pPager, OsFile *jfd, int useCksum){ assert( pPager->state>=PAGER_EXCLUSIVE || pPg!=0 ); TRACE3("PLAYBACK %d page %d\n", PAGERID(pPager), pgno); if( pPager->state>=PAGER_EXCLUSIVE && (pPg==0 || pPg->needSync==0) ){ - sqlite3OsSeek(&pPager->fd, (pgno-1)*(i64)pPager->pageSize); - rc = sqlite3OsWrite(&pPager->fd, aData, pPager->pageSize); + rc = sqlite3OsSeek(&pPager->fd, (pgno-1)*(i64)pPager->pageSize); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(&pPager->fd, aData, pPager->pageSize); + } if( pPg ) pPg->dirty = 0; } if( pPg ){ @@ -1168,8 +1172,10 @@ static int pager_reload_cache(Pager *pPager){ char zBuf[SQLITE_MAX_PAGE_SIZE]; if( !pPg->dirty ) continue; if( (int)pPg->pgno <= pPager->origDbSize ){ - sqlite3OsSeek(&pPager->fd, pPager->pageSize*(i64)(pPg->pgno-1)); - rc = sqlite3OsRead(&pPager->fd, zBuf, pPager->pageSize); + rc = sqlite3OsSeek(&pPager->fd, pPager->pageSize*(i64)(pPg->pgno-1)); + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(&pPager->fd, zBuf, pPager->pageSize); + } TRACE3("REFETCH %d page %d\n", PAGERID(pPager), pPg->pgno); if( rc ) break; CODEC(pPager, zBuf, pPg->pgno, 2); @@ -2124,11 +2130,14 @@ static int syncJournal(Pager *pPager){ rc = sqlite3OsSync(&pPager->jfd, 0); if( rc!=0 ) return rc; } - sqlite3OsSeek(&pPager->jfd, pPager->journalHdr + sizeof(aJournalMagic)); + rc = sqlite3OsSeek(&pPager->jfd, + pPager->journalHdr + sizeof(aJournalMagic)); + if( rc ) return rc; rc = write32bits(&pPager->jfd, pPager->nRec); if( rc ) return rc; - sqlite3OsSeek(&pPager->jfd, pPager->journalOff); + rc = sqlite3OsSeek(&pPager->jfd, pPager->journalOff); + if( rc ) return rc; } TRACE2("SYNC journal of %d\n", PAGERID(pPager)); rc = sqlite3OsSync(&pPager->jfd, pPager->fullSync); @@ -2196,7 +2205,8 @@ static int pager_write_pagelist(PgHdr *pList){ while( pList ){ assert( pList->dirty ); - sqlite3OsSeek(&pPager->fd, (pList->pgno-1)*(i64)pPager->pageSize); + rc = sqlite3OsSeek(&pPager->fd, (pList->pgno-1)*(i64)pPager->pageSize); + if( rc ) return rc; /* If there are dirty pages in the page cache with page numbers greater ** than Pager.dbSize, this means sqlite3pager_truncate() was called to ** make the file smaller (presumably by auto-vacuum code). Do not write @@ -2506,8 +2516,10 @@ int sqlite3pager_get(Pager *pPager, Pgno pgno, void **ppPage){ }else{ int rc; assert( MEMDB==0 ); - sqlite3OsSeek(&pPager->fd, (pgno-1)*(i64)pPager->pageSize); - rc = sqlite3OsRead(&pPager->fd, PGHDR_TO_DATA(pPg), pPager->pageSize); + rc = sqlite3OsSeek(&pPager->fd, (pgno-1)*(i64)pPager->pageSize); + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(&pPager->fd, PGHDR_TO_DATA(pPg), pPager->pageSize); + } TRACE3("FETCH %d page %d\n", PAGERID(pPager), pPg->pgno); CODEC(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); if( rc!=SQLITE_OK ){