1 /* 2 ** 2005 November 29 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ****************************************************************************** 12 ** 13 ** This file contains OS interface code that is common to all 14 ** architectures. 15 */ 16 #include "sqliteInt.h" 17 18 /* 19 ** If we compile with the SQLITE_TEST macro set, then the following block 20 ** of code will give us the ability to simulate a disk I/O error. This 21 ** is used for testing the I/O recovery logic. 22 */ 23 #if defined(SQLITE_TEST) 24 int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ 25 int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ 26 int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ 27 int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ 28 int sqlite3_io_error_benign = 0; /* True if errors are benign */ 29 int sqlite3_diskfull_pending = 0; 30 int sqlite3_diskfull = 0; 31 #endif /* defined(SQLITE_TEST) */ 32 33 /* 34 ** When testing, also keep a count of the number of open files. 35 */ 36 #if defined(SQLITE_TEST) 37 int sqlite3_open_file_count = 0; 38 #endif /* defined(SQLITE_TEST) */ 39 40 /* 41 ** The default SQLite sqlite3_vfs implementations do not allocate 42 ** memory (actually, os_unix.c allocates a small amount of memory 43 ** from within OsOpen()), but some third-party implementations may. 44 ** So we test the effects of a malloc() failing and the sqlite3OsXXX() 45 ** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. 46 ** 47 ** The following functions are instrumented for malloc() failure 48 ** testing: 49 ** 50 ** sqlite3OsRead() 51 ** sqlite3OsWrite() 52 ** sqlite3OsSync() 53 ** sqlite3OsFileSize() 54 ** sqlite3OsLock() 55 ** sqlite3OsCheckReservedLock() 56 ** sqlite3OsFileControl() 57 ** sqlite3OsShmMap() 58 ** sqlite3OsOpen() 59 ** sqlite3OsDelete() 60 ** sqlite3OsAccess() 61 ** sqlite3OsFullPathname() 62 ** 63 */ 64 #if defined(SQLITE_TEST) 65 int sqlite3_memdebug_vfs_oom_test = 1; 66 #define DO_OS_MALLOC_TEST(x) \ 67 if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3JournalIsInMemory(x))) { \ 68 void *pTstAlloc = sqlite3Malloc(10); \ 69 if (!pTstAlloc) return SQLITE_IOERR_NOMEM_BKPT; \ 70 sqlite3_free(pTstAlloc); \ 71 } 72 #else 73 #define DO_OS_MALLOC_TEST(x) 74 #endif 75 76 /* 77 ** The following routines are convenience wrappers around methods 78 ** of the sqlite3_file object. This is mostly just syntactic sugar. All 79 ** of this would be completely automatic if SQLite were coded using 80 ** C++ instead of plain old C. 81 */ 82 void sqlite3OsClose(sqlite3_file *pId){ 83 if( pId->pMethods ){ 84 pId->pMethods->xClose(pId); 85 pId->pMethods = 0; 86 } 87 } 88 int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ 89 DO_OS_MALLOC_TEST(id); 90 return id->pMethods->xRead(id, pBuf, amt, offset); 91 } 92 int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){ 93 DO_OS_MALLOC_TEST(id); 94 return id->pMethods->xWrite(id, pBuf, amt, offset); 95 } 96 int sqlite3OsTruncate(sqlite3_file *id, i64 size){ 97 return id->pMethods->xTruncate(id, size); 98 } 99 int sqlite3OsSync(sqlite3_file *id, int flags){ 100 DO_OS_MALLOC_TEST(id); 101 return flags ? id->pMethods->xSync(id, flags) : SQLITE_OK; 102 } 103 int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ 104 DO_OS_MALLOC_TEST(id); 105 return id->pMethods->xFileSize(id, pSize); 106 } 107 int sqlite3OsLock(sqlite3_file *id, int lockType){ 108 DO_OS_MALLOC_TEST(id); 109 return id->pMethods->xLock(id, lockType); 110 } 111 int sqlite3OsUnlock(sqlite3_file *id, int lockType){ 112 return id->pMethods->xUnlock(id, lockType); 113 } 114 int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ 115 DO_OS_MALLOC_TEST(id); 116 return id->pMethods->xCheckReservedLock(id, pResOut); 117 } 118 119 /* 120 ** Use sqlite3OsFileControl() when we are doing something that might fail 121 ** and we need to know about the failures. Use sqlite3OsFileControlHint() 122 ** when simply tossing information over the wall to the VFS and we do not 123 ** really care if the VFS receives and understands the information since it 124 ** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() 125 ** routine has no return value since the return value would be meaningless. 126 */ 127 int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ 128 if( id->pMethods==0 ) return SQLITE_NOTFOUND; 129 #ifdef SQLITE_TEST 130 if( op!=SQLITE_FCNTL_COMMIT_PHASETWO 131 && op!=SQLITE_FCNTL_LOCK_TIMEOUT 132 && op!=SQLITE_FCNTL_CKPT_DONE 133 && op!=SQLITE_FCNTL_CKPT_START 134 ){ 135 /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite 136 ** is using a regular VFS, it is called after the corresponding 137 ** transaction has been committed. Injecting a fault at this point 138 ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM 139 ** but the transaction is committed anyway. 140 ** 141 ** The core must call OsFileControl() though, not OsFileControlHint(), 142 ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably 143 ** means the commit really has failed and an error should be returned 144 ** to the user. 145 ** 146 ** The CKPT_DONE and CKPT_START file-controls are write-only signals 147 ** to the cksumvfs. Their return code is meaningless and is ignored 148 ** by the SQLite core, so there is no point in simulating OOMs for them. 149 */ 150 DO_OS_MALLOC_TEST(id); 151 } 152 #endif 153 return id->pMethods->xFileControl(id, op, pArg); 154 } 155 void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ 156 if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg); 157 } 158 159 int sqlite3OsSectorSize(sqlite3_file *id){ 160 int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; 161 return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); 162 } 163 int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ 164 if( NEVER(id->pMethods==0) ) return 0; 165 return id->pMethods->xDeviceCharacteristics(id); 166 } 167 #ifndef SQLITE_OMIT_WAL 168 int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ 169 return id->pMethods->xShmLock(id, offset, n, flags); 170 } 171 void sqlite3OsShmBarrier(sqlite3_file *id){ 172 id->pMethods->xShmBarrier(id); 173 } 174 int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){ 175 return id->pMethods->xShmUnmap(id, deleteFlag); 176 } 177 int sqlite3OsShmMap( 178 sqlite3_file *id, /* Database file handle */ 179 int iPage, 180 int pgsz, 181 int bExtend, /* True to extend file if necessary */ 182 void volatile **pp /* OUT: Pointer to mapping */ 183 ){ 184 DO_OS_MALLOC_TEST(id); 185 return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); 186 } 187 #endif /* SQLITE_OMIT_WAL */ 188 189 #if SQLITE_MAX_MMAP_SIZE>0 190 /* The real implementation of xFetch and xUnfetch */ 191 int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ 192 DO_OS_MALLOC_TEST(id); 193 return id->pMethods->xFetch(id, iOff, iAmt, pp); 194 } 195 int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ 196 return id->pMethods->xUnfetch(id, iOff, p); 197 } 198 #else 199 /* No-op stubs to use when memory-mapped I/O is disabled */ 200 int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ 201 *pp = 0; 202 return SQLITE_OK; 203 } 204 int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ 205 return SQLITE_OK; 206 } 207 #endif 208 209 /* 210 ** The next group of routines are convenience wrappers around the 211 ** VFS methods. 212 */ 213 int sqlite3OsOpen( 214 sqlite3_vfs *pVfs, 215 const char *zPath, 216 sqlite3_file *pFile, 217 int flags, 218 int *pFlagsOut 219 ){ 220 int rc; 221 DO_OS_MALLOC_TEST(0); 222 /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed 223 ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, 224 ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before 225 ** reaching the VFS. */ 226 assert( zPath || (flags & SQLITE_OPEN_EXCLUSIVE) ); 227 rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x1087f7f, pFlagsOut); 228 assert( rc==SQLITE_OK || pFile->pMethods==0 ); 229 return rc; 230 } 231 int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ 232 DO_OS_MALLOC_TEST(0); 233 assert( dirSync==0 || dirSync==1 ); 234 return pVfs->xDelete!=0 ? pVfs->xDelete(pVfs, zPath, dirSync) : SQLITE_OK; 235 } 236 int sqlite3OsAccess( 237 sqlite3_vfs *pVfs, 238 const char *zPath, 239 int flags, 240 int *pResOut 241 ){ 242 DO_OS_MALLOC_TEST(0); 243 return pVfs->xAccess(pVfs, zPath, flags, pResOut); 244 } 245 int sqlite3OsFullPathname( 246 sqlite3_vfs *pVfs, 247 const char *zPath, 248 int nPathOut, 249 char *zPathOut 250 ){ 251 DO_OS_MALLOC_TEST(0); 252 zPathOut[0] = 0; 253 return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); 254 } 255 #ifndef SQLITE_OMIT_LOAD_EXTENSION 256 void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ 257 assert( zPath!=0 ); 258 assert( strlen(zPath)<=SQLITE_MAX_PATHLEN ); /* tag-20210611-1 */ 259 return pVfs->xDlOpen(pVfs, zPath); 260 } 261 void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 262 pVfs->xDlError(pVfs, nByte, zBufOut); 263 } 264 void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){ 265 return pVfs->xDlSym(pVfs, pHdle, zSym); 266 } 267 void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ 268 pVfs->xDlClose(pVfs, pHandle); 269 } 270 #endif /* SQLITE_OMIT_LOAD_EXTENSION */ 271 int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ 272 if( sqlite3Config.iPrngSeed ){ 273 memset(zBufOut, 0, nByte); 274 if( ALWAYS(nByte>(signed)sizeof(unsigned)) ) nByte = sizeof(unsigned int); 275 memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); 276 return SQLITE_OK; 277 }else{ 278 return pVfs->xRandomness(pVfs, nByte, zBufOut); 279 } 280 281 } 282 int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ 283 return pVfs->xSleep(pVfs, nMicro); 284 } 285 int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ 286 return pVfs->xGetLastError ? pVfs->xGetLastError(pVfs, 0, 0) : 0; 287 } 288 int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ 289 int rc; 290 /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64() 291 ** method to get the current date and time if that method is available 292 ** (if iVersion is 2 or greater and the function pointer is not NULL) and 293 ** will fall back to xCurrentTime() if xCurrentTimeInt64() is 294 ** unavailable. 295 */ 296 if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){ 297 rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut); 298 }else{ 299 double r; 300 rc = pVfs->xCurrentTime(pVfs, &r); 301 *pTimeOut = (sqlite3_int64)(r*86400000.0); 302 } 303 return rc; 304 } 305 306 int sqlite3OsOpenMalloc( 307 sqlite3_vfs *pVfs, 308 const char *zFile, 309 sqlite3_file **ppFile, 310 int flags, 311 int *pOutFlags 312 ){ 313 int rc; 314 sqlite3_file *pFile; 315 pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); 316 if( pFile ){ 317 rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); 318 if( rc!=SQLITE_OK ){ 319 sqlite3_free(pFile); 320 *ppFile = 0; 321 }else{ 322 *ppFile = pFile; 323 } 324 }else{ 325 *ppFile = 0; 326 rc = SQLITE_NOMEM_BKPT; 327 } 328 assert( *ppFile!=0 || rc!=SQLITE_OK ); 329 return rc; 330 } 331 void sqlite3OsCloseFree(sqlite3_file *pFile){ 332 assert( pFile ); 333 sqlite3OsClose(pFile); 334 sqlite3_free(pFile); 335 } 336 337 /* 338 ** This function is a wrapper around the OS specific implementation of 339 ** sqlite3_os_init(). The purpose of the wrapper is to provide the 340 ** ability to simulate a malloc failure, so that the handling of an 341 ** error in sqlite3_os_init() by the upper layers can be tested. 342 */ 343 int sqlite3OsInit(void){ 344 void *p = sqlite3_malloc(10); 345 if( p==0 ) return SQLITE_NOMEM_BKPT; 346 sqlite3_free(p); 347 return sqlite3_os_init(); 348 } 349 350 /* 351 ** The list of all registered VFS implementations. 352 */ 353 static sqlite3_vfs * SQLITE_WSD vfsList = 0; 354 #define vfsList GLOBAL(sqlite3_vfs *, vfsList) 355 356 /* 357 ** Locate a VFS by name. If no name is given, simply return the 358 ** first VFS on the list. 359 */ 360 sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){ 361 sqlite3_vfs *pVfs = 0; 362 #if SQLITE_THREADSAFE 363 sqlite3_mutex *mutex; 364 #endif 365 #ifndef SQLITE_OMIT_AUTOINIT 366 int rc = sqlite3_initialize(); 367 if( rc ) return 0; 368 #endif 369 #if SQLITE_THREADSAFE 370 mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); 371 #endif 372 sqlite3_mutex_enter(mutex); 373 for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){ 374 if( zVfs==0 ) break; 375 if( strcmp(zVfs, pVfs->zName)==0 ) break; 376 } 377 sqlite3_mutex_leave(mutex); 378 return pVfs; 379 } 380 381 /* 382 ** Unlink a VFS from the linked list 383 */ 384 static void vfsUnlink(sqlite3_vfs *pVfs){ 385 assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)) ); 386 if( pVfs==0 ){ 387 /* No-op */ 388 }else if( vfsList==pVfs ){ 389 vfsList = pVfs->pNext; 390 }else if( vfsList ){ 391 sqlite3_vfs *p = vfsList; 392 while( p->pNext && p->pNext!=pVfs ){ 393 p = p->pNext; 394 } 395 if( p->pNext==pVfs ){ 396 p->pNext = pVfs->pNext; 397 } 398 } 399 } 400 401 /* 402 ** Register a VFS with the system. It is harmless to register the same 403 ** VFS multiple times. The new VFS becomes the default if makeDflt is 404 ** true. 405 */ 406 int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ 407 MUTEX_LOGIC(sqlite3_mutex *mutex;) 408 #ifndef SQLITE_OMIT_AUTOINIT 409 int rc = sqlite3_initialize(); 410 if( rc ) return rc; 411 #endif 412 #ifdef SQLITE_ENABLE_API_ARMOR 413 if( pVfs==0 ) return SQLITE_MISUSE_BKPT; 414 #endif 415 416 MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) 417 sqlite3_mutex_enter(mutex); 418 vfsUnlink(pVfs); 419 if( makeDflt || vfsList==0 ){ 420 pVfs->pNext = vfsList; 421 vfsList = pVfs; 422 }else{ 423 pVfs->pNext = vfsList->pNext; 424 vfsList->pNext = pVfs; 425 } 426 assert(vfsList); 427 sqlite3_mutex_leave(mutex); 428 return SQLITE_OK; 429 } 430 431 /* 432 ** Unregister a VFS so that it is no longer accessible. 433 */ 434 int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ 435 MUTEX_LOGIC(sqlite3_mutex *mutex;) 436 #ifndef SQLITE_OMIT_AUTOINIT 437 int rc = sqlite3_initialize(); 438 if( rc ) return rc; 439 #endif 440 MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) 441 sqlite3_mutex_enter(mutex); 442 vfsUnlink(pVfs); 443 sqlite3_mutex_leave(mutex); 444 return SQLITE_OK; 445 } 446