]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Defend against disk I/O errors that happen during an sqlite3OsSeek(). (CVS 2679)
authordrh <drh@noemail.net>
Fri, 9 Sep 2005 01:32:06 +0000 (01:32 +0000)
committerdrh <drh@noemail.net>
Fri, 9 Sep 2005 01:32:06 +0000 (01:32 +0000)
FossilOrigin-Name: 461e3a0a27ff083b0bae10c9880e3b41bb85ee31

manifest
manifest.uuid
src/os_unix.c
src/os_win.c
src/pager.c

index 71b2dc340db6a12cb13cbf5e64657077b76e96db..4802010dde6ab88745d23d56fa61a5c4096c7bda 100644 (file)
--- 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
index 85716b801c38d697ced5411715395a3e52292b10..e355d64c54afcfe96696e10d30cb5fb9f0bac9e3 100644 (file)
@@ -1 +1 @@
-6281859425d39c11d82875301fefafad1f08416d
\ No newline at end of file
+461e3a0a27ff083b0bae10c9880e3b41bb85ee31
\ No newline at end of file
index 2f2303173c30cd58a8b924c6b73b8ed8f80029d4..959e2a6816c993a67f697f585d2ea2f73ac0a073 100644 (file)
@@ -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;
 }
index 8639ef2db077a86a4d3139d0ed4b254d63788dac..b2fda66b479bbbe9c2b25466e773929fec4e5882 100644 (file)
@@ -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);
index 9b852385bd389f4ed04b9bcfd3d77a6cf13373bc..d898d029d8ce44d99fce17bc2e031e9ff42867bc 100644 (file)
@@ -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 ){