Index: third_party/sqlite/src/src/os.c |
diff --git a/third_party/sqlite/src/src/os.c b/third_party/sqlite/src/src/os.c |
index ba0438adef021ee3e0f5de840e3373390a0da611..b6c28a1dc447b43023d345f62caf6bb7b49ee8b5 100644 |
--- a/third_party/sqlite/src/src/os.c |
+++ b/third_party/sqlite/src/src/os.c |
@@ -27,11 +27,18 @@ |
** The following functions are instrumented for malloc() failure |
** testing: |
** |
-** sqlite3OsOpen() |
** sqlite3OsRead() |
** sqlite3OsWrite() |
** sqlite3OsSync() |
+** sqlite3OsFileSize() |
** sqlite3OsLock() |
+** sqlite3OsCheckReservedLock() |
+** sqlite3OsFileControl() |
+** sqlite3OsShmMap() |
+** sqlite3OsOpen() |
+** sqlite3OsDelete() |
+** sqlite3OsAccess() |
+** sqlite3OsFullPathname() |
** |
*/ |
#if defined(SQLITE_TEST) |
@@ -90,9 +97,37 @@ int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ |
DO_OS_MALLOC_TEST(id); |
return id->pMethods->xCheckReservedLock(id, pResOut); |
} |
+ |
+/* |
+** Use sqlite3OsFileControl() when we are doing something that might fail |
+** and we need to know about the failures. Use sqlite3OsFileControlHint() |
+** when simply tossing information over the wall to the VFS and we do not |
+** really care if the VFS receives and understands the information since it |
+** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() |
+** routine has no return value since the return value would be meaningless. |
+*/ |
int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ |
+#ifdef SQLITE_TEST |
+ if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){ |
+ /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite |
+ ** is using a regular VFS, it is called after the corresponding |
+ ** transaction has been committed. Injecting a fault at this point |
+ ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM |
+ ** but the transaction is committed anyway. |
+ ** |
+ ** The core must call OsFileControl() though, not OsFileControlHint(), |
+ ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably |
+ ** means the commit really has failed and an error should be returned |
+ ** to the user. */ |
+ DO_OS_MALLOC_TEST(id); |
+ } |
+#endif |
return id->pMethods->xFileControl(id, op, pArg); |
} |
+void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ |
+ (void)id->pMethods->xFileControl(id, op, pArg); |
+} |
+ |
int sqlite3OsSectorSize(sqlite3_file *id){ |
int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; |
return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); |
@@ -116,9 +151,30 @@ int sqlite3OsShmMap( |
int bExtend, /* True to extend file if necessary */ |
void volatile **pp /* OUT: Pointer to mapping */ |
){ |
+ DO_OS_MALLOC_TEST(id); |
return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); |
} |
+#if SQLITE_MAX_MMAP_SIZE>0 |
+/* The real implementation of xFetch and xUnfetch */ |
+int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ |
+ DO_OS_MALLOC_TEST(id); |
+ return id->pMethods->xFetch(id, iOff, iAmt, pp); |
+} |
+int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ |
+ return id->pMethods->xUnfetch(id, iOff, p); |
+} |
+#else |
+/* No-op stubs to use when memory-mapped I/O is disabled */ |
+int sqlite3OsFetch(sqlite3_file *id, i64 iOff, int iAmt, void **pp){ |
+ *pp = 0; |
+ return SQLITE_OK; |
+} |
+int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ |
+ return SQLITE_OK; |
+} |
+#endif |
+ |
/* |
** The next group of routines are convenience wrappers around the |
** VFS methods. |
@@ -132,15 +188,17 @@ int sqlite3OsOpen( |
){ |
int rc; |
DO_OS_MALLOC_TEST(0); |
- /* 0x87f3f is a mask of SQLITE_OPEN_ flags that are valid to be passed |
+ /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed |
** down into the VFS layer. Some SQLITE_OPEN_ flags (for example, |
** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before |
** reaching the VFS. */ |
- rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f3f, pFlagsOut); |
+ rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut); |
assert( rc==SQLITE_OK || pFile->pMethods==0 ); |
return rc; |
} |
int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ |
+ DO_OS_MALLOC_TEST(0); |
+ assert( dirSync==0 || dirSync==1 ); |
return pVfs->xDelete(pVfs, zPath, dirSync); |
} |
int sqlite3OsAccess( |
@@ -158,6 +216,7 @@ int sqlite3OsFullPathname( |
int nPathOut, |
char *zPathOut |
){ |
+ DO_OS_MALLOC_TEST(0); |
zPathOut[0] = 0; |
return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); |
} |
@@ -208,7 +267,7 @@ int sqlite3OsOpenMalloc( |
){ |
int rc = SQLITE_NOMEM; |
sqlite3_file *pFile; |
- pFile = (sqlite3_file *)sqlite3Malloc(pVfs->szOsFile); |
+ pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); |
if( pFile ){ |
rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags); |
if( rc!=SQLITE_OK ){ |
@@ -297,12 +356,12 @@ static void vfsUnlink(sqlite3_vfs *pVfs){ |
** true. |
*/ |
int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){ |
- sqlite3_mutex *mutex = 0; |
+ MUTEX_LOGIC(sqlite3_mutex *mutex;) |
#ifndef SQLITE_OMIT_AUTOINIT |
int rc = sqlite3_initialize(); |
if( rc ) return rc; |
#endif |
- mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
+ MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) |
sqlite3_mutex_enter(mutex); |
vfsUnlink(pVfs); |
if( makeDflt || vfsList==0 ){ |