OLD | NEW |
1 This is a backport of http://sqlite.org/src/ci/9109128cb5, | 1 This is a backport of the following sqlite changes: |
2 which is needed for experiments with using unpatched sqlite. | 2 |
| 3 1. http://sqlite.org/src/ci/9109128cb5 |
| 4 2. http://sqlite.org/src/ci/713b1b7dc1 |
| 5 3. http://sqlite.org/src/ci/8d1b5c3ac0 |
| 6 4. http://sqlite.org/src/ci/6b236069e1 |
| 7 5. http://sqlite.org/src/ci/880b51150a |
| 8 |
| 9 which are needed for experiments with using unpatched sqlite. |
3 If you hit a merge conflict on this file it is most likely | 10 If you hit a merge conflict on this file it is most likely |
4 that you've upgraded to version of sqlite that includes this patch. | 11 that you've upgraded to version of sqlite that includes those patches. |
5 Index: src/os_unix.c | 12 diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amal
gamation/sqlite3.c |
6 =================================================================== | 13 index 3e794a9..73ff15f 100644 |
7 --- src/os_unix.c | 14 --- a/third_party/sqlite/amalgamation/sqlite3.c |
8 +++ src/os_unix.c | 15 +++ b/third_party/sqlite/amalgamation/sqlite3.c |
9 @@ -4787,11 +4787,11 @@ | 16 @@ -24144,7 +24144,6 @@ struct unixFile { |
10 ** ignored and -1 is returned. The caller will try to open a new file | 17 sqlite3_io_methods const *pMethod; /* Always the first entry */ |
11 ** descriptor on the same path, fail, and return an error to SQLite. | 18 unixInodeInfo *pInode; /* Info about locks on this inode */ |
12 ** | 19 int h; /* The file descriptor */ |
13 ** Even if a subsequent open() call does succeed, the consequences of | 20 - int dirfd; /* File descriptor for the directory */ |
14 ** not searching for a resusable file descriptor are not dire. */ | 21 unsigned char eFileLock; /* The type of lock held on this fd */ |
15 - if( 0==stat(zPath, &sStat) ){ | 22 unsigned char ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ |
16 + if( 0==osStat(zPath, &sStat) ){ | 23 int lastErrno; /* The unix errno from last I/O error */ |
17 unixInodeInfo *pInode; | 24 @@ -24188,6 +24187,7 @@ struct unixFile { |
18 | 25 */ |
19 unixEnterMutex(); | 26 #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ |
20 pInode = inodeList; | 27 #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ |
21 while( pInode && (pInode->fileId.dev!=sStat.st_dev | 28 +#define UNIXFILE_DIRSYNC 0x04 /* Directory sync needed */ |
22 @@ -4863,11 +4863,11 @@ | 29 |
23 while( nDb>0 && zPath[nDb]!='-' ) nDb--; | 30 /* |
24 if( nDb==0 ) return SQLITE_OK; | 31 ** Include code that is common to all os_*.c files |
25 memcpy(zDb, zPath, nDb); | 32 @@ -24426,6 +24426,9 @@ SQLITE_API int sqlite3_open_file_count = 0; |
26 zDb[nDb] = '\0'; | 33 #define threadid 0 |
27 | 34 #endif |
28 - if( 0==stat(zDb, &sStat) ){ | 35 |
29 + if( 0==osStat(zDb, &sStat) ){ | 36 +/* Forward reference */ |
30 *pMode = sStat.st_mode & 0777; | 37 +static int openDirectory(const char*, int*); |
31 }else{ | 38 + |
32 rc = SQLITE_IOERR_FSTAT; | 39 /* |
33 } | 40 ** Many system calls are accessed through pointer-to-functions so that |
34 }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ | 41 ** they may be overridden at runtime to facilitate fault injection during |
35 @@ -5208,11 +5208,11 @@ | 42 @@ -24522,6 +24525,12 @@ static struct unix_syscall { |
36 assert(!"Invalid flags argument"); | 43 #endif |
37 } | 44 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) |
38 *pResOut = (osAccess(zPath, amode)==0); | 45 |
39 if( flags==SQLITE_ACCESS_EXISTS && *pResOut ){ | 46 + { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, |
40 struct stat buf; | 47 +#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) |
41 - if( 0==stat(zPath, &buf) && buf.st_size==0 ){ | 48 + |
42 + if( 0==osStat(zPath, &buf) && buf.st_size==0 ){ | 49 + { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, |
43 *pResOut = 0; | 50 +#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) |
44 } | 51 + |
45 } | 52 }; /* End of the overrideable system calls */ |
46 return SQLITE_OK; | 53 |
| 54 /* |
| 55 @@ -25876,10 +25885,6 @@ static int unixUnlock(sqlite3_file *id, int eFileLock){ |
| 56 */ |
| 57 static int closeUnixFile(sqlite3_file *id){ |
| 58 unixFile *pFile = (unixFile*)id; |
| 59 - if( pFile->dirfd>=0 ){ |
| 60 - robust_close(pFile, pFile->dirfd, __LINE__); |
| 61 - pFile->dirfd=-1; |
| 62 - } |
| 63 if( pFile->h>=0 ){ |
| 64 robust_close(pFile, pFile->h, __LINE__); |
| 65 pFile->h = -1; |
| 66 @@ -25887,7 +25892,7 @@ static int closeUnixFile(sqlite3_file *id){ |
| 67 #if OS_VXWORKS |
| 68 if( pFile->pId ){ |
| 69 if( pFile->isDelete ){ |
| 70 - unlink(pFile->pId->zCanonicalName); |
| 71 + osUnlink(pFile->pId->zCanonicalName); |
| 72 } |
| 73 vxworksReleaseFileId(pFile->pId); |
| 74 pFile->pId = 0; |
| 75 @@ -26134,7 +26139,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock
) { |
| 76 |
| 77 /* To fully unlock the database, delete the lock file */ |
| 78 assert( eFileLock==NO_LOCK ); |
| 79 - if( unlink(zLockFile) ){ |
| 80 + if( osUnlink(zLockFile) ){ |
| 81 int rc = 0; |
| 82 int tErrno = errno; |
| 83 if( ENOENT != tErrno ){ |
| 84 @@ -27371,6 +27376,50 @@ static int full_fsync(int fd, int fullSync, int dataOnl
y){ |
47 } | 85 } |
48 | 86 |
| 87 /* |
| 88 +** Open a file descriptor to the directory containing file zFilename. |
| 89 +** If successful, *pFd is set to the opened file descriptor and |
| 90 +** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM |
| 91 +** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined |
| 92 +** value. |
| 93 +** |
| 94 +** The directory file descriptor is used for only one thing - to |
| 95 +** fsync() a directory to make sure file creation and deletion events |
| 96 +** are flushed to disk. Such fsyncs are not needed on newer |
| 97 +** journaling filesystems, but are required on older filesystems. |
| 98 +** |
| 99 +** This routine can be overridden using the xSetSysCall interface. |
| 100 +** The ability to override this routine was added in support of the |
| 101 +** chromium sandbox. Opening a directory is a security risk (we are |
| 102 +** told) so making it overrideable allows the chromium sandbox to |
| 103 +** replace this routine with a harmless no-op. To make this routine |
| 104 +** a no-op, replace it with a stub that returns SQLITE_OK but leaves |
| 105 +** *pFd set to a negative number. |
| 106 +** |
| 107 +** If SQLITE_OK is returned, the caller is responsible for closing |
| 108 +** the file descriptor *pFd using close(). |
| 109 +*/ |
| 110 +static int openDirectory(const char *zFilename, int *pFd){ |
| 111 + int ii; |
| 112 + int fd = -1; |
| 113 + char zDirname[MAX_PATHNAME+1]; |
| 114 + |
| 115 + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
| 116 + for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
| 117 + if( ii>0 ){ |
| 118 + zDirname[ii] = '\0'; |
| 119 + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
| 120 + if( fd>=0 ){ |
| 121 +#ifdef FD_CLOEXEC |
| 122 + osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 123 +#endif |
| 124 + OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
| 125 + } |
| 126 + } |
| 127 + *pFd = fd; |
| 128 + return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname))
; |
| 129 +} |
| 130 + |
| 131 +/* |
| 132 ** Make sure all writes to a particular file are committed to disk. |
| 133 ** |
| 134 ** If dataOnly==0 then both the file itself and its metadata (file |
| 135 @@ -27410,28 +27459,21 @@ static int unixSync(sqlite3_file *id, int flags){ |
| 136 pFile->lastErrno = errno; |
| 137 return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); |
| 138 } |
| 139 - if( pFile->dirfd>=0 ){ |
| 140 - OSTRACE(("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd, |
| 141 + |
| 142 + /* Also fsync the directory containing the file if the DIRSYNC flag |
| 143 + ** is set. This is a one-time occurrance. Many systems (examples: AIX) |
| 144 + ** are unable to fsync a directory, so ignore errors on the fsync. |
| 145 + */ |
| 146 + if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ |
| 147 + int dirfd; |
| 148 + OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, |
| 149 HAVE_FULLFSYNC, isFullsync)); |
| 150 -#ifndef SQLITE_DISABLE_DIRSYNC |
| 151 - /* The directory sync is only attempted if full_fsync is |
| 152 - ** turned off or unavailable. If a full_fsync occurred above, |
| 153 - ** then the directory sync is superfluous. |
| 154 - */ |
| 155 - if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){ |
| 156 - /* |
| 157 - ** We have received multiple reports of fsync() returning |
| 158 - ** errors when applied to directories on certain file systems. |
| 159 - ** A failed directory sync is not a big deal. So it seems |
| 160 - ** better to ignore the error. Ticket #1657 |
| 161 - */ |
| 162 - /* pFile->lastErrno = errno; */ |
| 163 - /* return SQLITE_IOERR; */ |
| 164 + rc = osOpenDirectory(pFile->zPath, &dirfd); |
| 165 + if( rc==SQLITE_OK && dirfd>=0 ){ |
| 166 + full_fsync(dirfd, 0, 0); |
| 167 + robust_close(pFile, dirfd, __LINE__); |
| 168 } |
| 169 -#endif |
| 170 - /* Only need to sync once, so close the directory when we are done */ |
| 171 - robust_close(pFile, pFile->dirfd, __LINE__); |
| 172 - pFile->dirfd = -1; |
| 173 + pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; |
| 174 } |
| 175 return rc; |
| 176 } |
| 177 @@ -28255,7 +28297,7 @@ static int unixShmUnmap( |
| 178 assert( pShmNode->nRef>0 ); |
| 179 pShmNode->nRef--; |
| 180 if( pShmNode->nRef==0 ){ |
| 181 - if( deleteFlag && pShmNode->h>=0 ) unlink(pShmNode->zFilename); |
| 182 + if( deleteFlag && pShmNode->h>=0 ) osUnlink(pShmNode->zFilename); |
| 183 unixShmPurge(pDbFd); |
| 184 } |
| 185 unixLeaveMutex(); |
| 186 @@ -28575,7 +28617,7 @@ void initUnixFile(sqlite3_file* file) { |
| 187 int fillInUnixFile( |
| 188 sqlite3_vfs *pVfs, /* Pointer to vfs object */ |
| 189 int h, /* Open file descriptor of file being opened */ |
| 190 - int dirfd, /* Directory file descriptor */ |
| 191 + int syncDir, /* True to sync directory on first sync */ |
| 192 sqlite3_file *pId, /* Write to the unixFile structure here */ |
| 193 const char *zFilename, /* Name of the file being opened */ |
| 194 int noLock, /* Omit locking if true */ |
| 195 @@ -28606,7 +28648,6 @@ int fillInUnixFile( |
| 196 |
| 197 OSTRACE(("OPEN %-3d %s\n", h, zFilename)); |
| 198 pNew->h = h; |
| 199 - pNew->dirfd = dirfd; |
| 200 pNew->zPath = zFilename; |
| 201 if( memcmp(pVfs->zName,"unix-excl",10)==0 ){ |
| 202 pNew->ctrlFlags = UNIXFILE_EXCL; |
| 203 @@ -28616,6 +28657,9 @@ int fillInUnixFile( |
| 204 if( isReadOnly ){ |
| 205 pNew->ctrlFlags |= UNIXFILE_RDONLY; |
| 206 } |
| 207 + if( syncDir ){ |
| 208 + pNew->ctrlFlags |= UNIXFILE_DIRSYNC; |
| 209 + } |
| 210 |
| 211 #if OS_VXWORKS |
| 212 pNew->pId = vxworksFindFileId(zFilename); |
| 213 @@ -28742,13 +28786,12 @@ int fillInUnixFile( |
| 214 if( rc!=SQLITE_OK ){ |
| 215 if( h>=0 ) robust_close(pNew, h, __LINE__); |
| 216 h = -1; |
| 217 - unlink(zFilename); |
| 218 + osUnlink(zFilename); |
| 219 isDelete = 0; |
| 220 } |
| 221 pNew->isDelete = isDelete; |
| 222 #endif |
| 223 if( rc!=SQLITE_OK ){ |
| 224 - if( dirfd>=0 ) robust_close(pNew, dirfd, __LINE__); |
| 225 if( h>=0 ) robust_close(pNew, h, __LINE__); |
| 226 }else{ |
| 227 pNew->pMethod = pLockingStyle; |
| 228 @@ -28758,37 +28801,6 @@ int fillInUnixFile( |
| 229 } |
| 230 |
| 231 /* |
| 232 -** Open a file descriptor to the directory containing file zFilename. |
| 233 -** If successful, *pFd is set to the opened file descriptor and |
| 234 -** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM |
| 235 -** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined |
| 236 -** value. |
| 237 -** |
| 238 -** If SQLITE_OK is returned, the caller is responsible for closing |
| 239 -** the file descriptor *pFd using close(). |
| 240 -*/ |
| 241 -static int openDirectory(const char *zFilename, int *pFd){ |
| 242 - int ii; |
| 243 - int fd = -1; |
| 244 - char zDirname[MAX_PATHNAME+1]; |
| 245 - |
| 246 - sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
| 247 - for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
| 248 - if( ii>0 ){ |
| 249 - zDirname[ii] = '\0'; |
| 250 - fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
| 251 - if( fd>=0 ){ |
| 252 -#ifdef FD_CLOEXEC |
| 253 - osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 254 -#endif |
| 255 - OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
| 256 - } |
| 257 - } |
| 258 - *pFd = fd; |
| 259 - return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname))
; |
| 260 -} |
| 261 - |
| 262 -/* |
| 263 ** Return the name of a directory in which to put temporary files. |
| 264 ** If no suitable temporary file directory can be found, return NULL. |
| 265 */ |
| 266 @@ -29083,7 +29095,6 @@ static int unixOpen( |
| 267 ){ |
| 268 unixFile *p = (unixFile *)pFile; |
| 269 int fd = -1; /* File descriptor returned by open() */ |
| 270 - int dirfd = -1; /* Directory file descriptor */ |
| 271 int openFlags = 0; /* Flags to pass to open() */ |
| 272 int eType = flags&0xFFFFFF00; /* Type of file to open */ |
| 273 int noLock; /* True to omit locking primitives */ |
| 274 @@ -29102,7 +29113,7 @@ static int unixOpen( |
| 275 ** a file-descriptor on the directory too. The first time unixSync() |
| 276 ** is called the directory file descriptor will be fsync()ed and close()d. |
| 277 */ |
| 278 - int isOpenDirectory = (isCreate && ( |
| 279 + int syncDir = (isCreate && ( |
| 280 eType==SQLITE_OPEN_MASTER_JOURNAL |
| 281 || eType==SQLITE_OPEN_MAIN_JOURNAL |
| 282 || eType==SQLITE_OPEN_WAL |
| 283 @@ -29149,7 +29160,7 @@ static int unixOpen( |
| 284 } |
| 285 }else if( !zName ){ |
| 286 /* If zName is NULL, the upper layer is requesting a temp file. */ |
| 287 - assert(isDelete && !isOpenDirectory); |
| 288 + assert(isDelete && !syncDir); |
| 289 rc = unixGetTempname(MAX_PATHNAME+1, zTmpname); |
| 290 if( rc!=SQLITE_OK ){ |
| 291 return rc; |
| 292 @@ -29202,7 +29213,7 @@ static int unixOpen( |
| 293 #if OS_VXWORKS |
| 294 zPath = zName; |
| 295 #else |
| 296 - unlink(zName); |
| 297 + osUnlink(zName); |
| 298 #endif |
| 299 } |
| 300 #if SQLITE_ENABLE_LOCKING_STYLE |
| 301 @@ -29211,19 +29222,6 @@ static int unixOpen( |
| 302 } |
| 303 #endif |
| 304 |
| 305 - if( isOpenDirectory ){ |
| 306 - rc = openDirectory(zPath, &dirfd); |
| 307 - if( rc!=SQLITE_OK ){ |
| 308 - /* It is safe to close fd at this point, because it is guaranteed not |
| 309 - ** to be open on a database file. If it were open on a database file, |
| 310 - ** it would not be safe to close as this would release any locks held |
| 311 - ** on the file by this process. */ |
| 312 - assert( eType!=SQLITE_OPEN_MAIN_DB ); |
| 313 - robust_close(p, fd, __LINE__); |
| 314 - goto open_finished; |
| 315 - } |
| 316 - } |
| 317 - |
| 318 #ifdef FD_CLOEXEC |
| 319 osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 320 #endif |
| 321 @@ -29235,7 +29233,6 @@ static int unixOpen( |
| 322 struct statfs fsInfo; |
| 323 if( fstatfs(fd, &fsInfo) == -1 ){ |
| 324 ((unixFile*)pFile)->lastErrno = errno; |
| 325 - if( dirfd>=0 ) robust_close(p, dirfd, __LINE__); |
| 326 robust_close(p, fd, __LINE__); |
| 327 return SQLITE_IOERR_ACCESS; |
| 328 } |
| 329 @@ -29267,9 +29264,6 @@ static int unixOpen( |
| 330 ** not while other file descriptors opened by the same process on |
| 331 ** the same file are working. */ |
| 332 p->lastErrno = errno; |
| 333 - if( dirfd>=0 ){ |
| 334 - robust_close(p, dirfd, __LINE__); |
| 335 - } |
| 336 robust_close(p, fd, __LINE__); |
| 337 rc = SQLITE_IOERR_ACCESS; |
| 338 goto open_finished; |
| 339 @@ -29277,7 +29271,7 @@ static int unixOpen( |
| 340 useProxy = !(fsInfo.f_flags&MNT_LOCAL); |
| 341 } |
| 342 if( useProxy ){ |
| 343 - rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, |
| 344 + rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, |
| 345 isDelete, isReadonly); |
| 346 if( rc==SQLITE_OK ){ |
| 347 rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); |
| 348 @@ -29295,7 +29289,7 @@ static int unixOpen( |
| 349 } |
| 350 #endif |
| 351 |
| 352 - rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, |
| 353 + rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, |
| 354 isDelete, isReadonly); |
| 355 open_finished: |
| 356 if( rc!=SQLITE_OK ){ |
| 357 @@ -29317,13 +29311,13 @@ static int unixDelete( |
| 358 int rc = SQLITE_OK; |
| 359 UNUSED_PARAMETER(NotUsed); |
| 360 SimulateIOError(return SQLITE_IOERR_DELETE); |
| 361 - if( unlink(zPath)==(-1) && errno!=ENOENT ){ |
| 362 + if( osUnlink(zPath)==(-1) && errno!=ENOENT ){ |
| 363 return unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); |
| 364 } |
| 365 #ifndef SQLITE_DISABLE_DIRSYNC |
| 366 if( dirSync ){ |
| 367 int fd; |
| 368 - rc = openDirectory(zPath, &fd); |
| 369 + rc = osOpenDirectory(zPath, &fd); |
| 370 if( rc==SQLITE_OK ){ |
| 371 #if OS_VXWORKS |
| 372 if( fsync(fd)==-1 ) |
| 373 @@ -29895,7 +29889,6 @@ static int proxyCreateUnixFile( |
| 374 int islockfile /* if non zero missing dirs will be created */ |
| 375 ) { |
| 376 int fd = -1; |
| 377 - int dirfd = -1; |
| 378 unixFile *pNew; |
| 379 int rc = SQLITE_OK; |
| 380 int openFlags = O_RDWR | O_CREAT; |
| 381 @@ -29960,7 +29953,7 @@ static int proxyCreateUnixFile( |
| 382 pUnused->flags = openFlags; |
| 383 pNew->pUnused = pUnused; |
| 384 |
| 385 - rc = fillInUnixFile(&dummyVfs, fd, dirfd, (sqlite3_file*)pNew, path, 0, 0, 0)
; |
| 386 + rc = fillInUnixFile(&dummyVfs, fd, 0, (sqlite3_file*)pNew, path, 0, 0, 0); |
| 387 if( rc==SQLITE_OK ){ |
| 388 *ppFile = pNew; |
| 389 return SQLITE_OK; |
| 390 @@ -30074,7 +30067,7 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t m
yHostID){ |
| 391 end_breaklock: |
| 392 if( rc ){ |
| 393 if( fd>=0 ){ |
| 394 - unlink(tPath); |
| 395 + osUnlink(tPath); |
| 396 robust_close(pFile, fd, __LINE__); |
| 397 } |
| 398 fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg); |
| 399 @@ -30897,7 +30890,7 @@ SQLITE_API int sqlite3_os_init(void){ |
| 400 |
| 401 /* Double-check that the aSyscall[] array has been constructed |
| 402 ** correctly. See ticket [bb3a86e890c8e96ab] */ |
| 403 - assert( ArraySize(aSyscall)==16 ); |
| 404 + assert( ArraySize(aSyscall)==18 ); |
| 405 |
| 406 /* Register all VFSes defined in the aVfs[] array */ |
| 407 for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ |
| 408 diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/o
s_unix.c |
| 409 index e5b2540..804c588 100644 |
| 410 --- a/third_party/sqlite/src/src/os_unix.c |
| 411 +++ b/third_party/sqlite/src/src/os_unix.c |
| 412 @@ -204,7 +204,6 @@ struct unixFile { |
| 413 sqlite3_io_methods const *pMethod; /* Always the first entry */ |
| 414 unixInodeInfo *pInode; /* Info about locks on this inode */ |
| 415 int h; /* The file descriptor */ |
| 416 - int dirfd; /* File descriptor for the directory */ |
| 417 unsigned char eFileLock; /* The type of lock held on this fd */ |
| 418 unsigned char ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ |
| 419 int lastErrno; /* The unix errno from last I/O error */ |
| 420 @@ -248,6 +247,7 @@ struct unixFile { |
| 421 */ |
| 422 #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ |
| 423 #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ |
| 424 +#define UNIXFILE_DIRSYNC 0x04 /* Directory sync needed */ |
| 425 |
| 426 /* |
| 427 ** Include code that is common to all os_*.c files |
| 428 @@ -281,6 +281,9 @@ struct unixFile { |
| 429 #define threadid 0 |
| 430 #endif |
| 431 |
| 432 +/* Forward reference */ |
| 433 +static int openDirectory(const char*, int*); |
| 434 + |
| 435 /* |
| 436 ** Many system calls are accessed through pointer-to-functions so that |
| 437 ** they may be overridden at runtime to facilitate fault injection during |
| 438 @@ -377,6 +380,12 @@ static struct unix_syscall { |
| 439 #endif |
| 440 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) |
| 441 |
| 442 + { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, |
| 443 +#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) |
| 444 + |
| 445 + { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, |
| 446 +#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) |
| 447 + |
| 448 }; /* End of the overrideable system calls */ |
| 449 |
| 450 /* |
| 451 @@ -1731,10 +1740,6 @@ static int unixUnlock(sqlite3_file *id, int eFileLock){ |
| 452 */ |
| 453 static int closeUnixFile(sqlite3_file *id){ |
| 454 unixFile *pFile = (unixFile*)id; |
| 455 - if( pFile->dirfd>=0 ){ |
| 456 - robust_close(pFile, pFile->dirfd, __LINE__); |
| 457 - pFile->dirfd=-1; |
| 458 - } |
| 459 if( pFile->h>=0 ){ |
| 460 robust_close(pFile, pFile->h, __LINE__); |
| 461 pFile->h = -1; |
| 462 @@ -1742,7 +1747,7 @@ static int closeUnixFile(sqlite3_file *id){ |
| 463 #if OS_VXWORKS |
| 464 if( pFile->pId ){ |
| 465 if( pFile->isDelete ){ |
| 466 - unlink(pFile->pId->zCanonicalName); |
| 467 + osUnlink(pFile->pId->zCanonicalName); |
| 468 } |
| 469 vxworksReleaseFileId(pFile->pId); |
| 470 pFile->pId = 0; |
| 471 @@ -1989,7 +1994,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock)
{ |
| 472 |
| 473 /* To fully unlock the database, delete the lock file */ |
| 474 assert( eFileLock==NO_LOCK ); |
| 475 - if( unlink(zLockFile) ){ |
| 476 + if( osUnlink(zLockFile) ){ |
| 477 int rc = 0; |
| 478 int tErrno = errno; |
| 479 if( ENOENT != tErrno ){ |
| 480 @@ -3226,6 +3231,50 @@ static int full_fsync(int fd, int fullSync, int dataOnly)
{ |
| 481 } |
| 482 |
| 483 /* |
| 484 +** Open a file descriptor to the directory containing file zFilename. |
| 485 +** If successful, *pFd is set to the opened file descriptor and |
| 486 +** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM |
| 487 +** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined |
| 488 +** value. |
| 489 +** |
| 490 +** The directory file descriptor is used for only one thing - to |
| 491 +** fsync() a directory to make sure file creation and deletion events |
| 492 +** are flushed to disk. Such fsyncs are not needed on newer |
| 493 +** journaling filesystems, but are required on older filesystems. |
| 494 +** |
| 495 +** This routine can be overridden using the xSetSysCall interface. |
| 496 +** The ability to override this routine was added in support of the |
| 497 +** chromium sandbox. Opening a directory is a security risk (we are |
| 498 +** told) so making it overrideable allows the chromium sandbox to |
| 499 +** replace this routine with a harmless no-op. To make this routine |
| 500 +** a no-op, replace it with a stub that returns SQLITE_OK but leaves |
| 501 +** *pFd set to a negative number. |
| 502 +** |
| 503 +** If SQLITE_OK is returned, the caller is responsible for closing |
| 504 +** the file descriptor *pFd using close(). |
| 505 +*/ |
| 506 +static int openDirectory(const char *zFilename, int *pFd){ |
| 507 + int ii; |
| 508 + int fd = -1; |
| 509 + char zDirname[MAX_PATHNAME+1]; |
| 510 + |
| 511 + sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
| 512 + for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
| 513 + if( ii>0 ){ |
| 514 + zDirname[ii] = '\0'; |
| 515 + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
| 516 + if( fd>=0 ){ |
| 517 +#ifdef FD_CLOEXEC |
| 518 + osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 519 +#endif |
| 520 + OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
| 521 + } |
| 522 + } |
| 523 + *pFd = fd; |
| 524 + return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname))
; |
| 525 +} |
| 526 + |
| 527 +/* |
| 528 ** Make sure all writes to a particular file are committed to disk. |
| 529 ** |
| 530 ** If dataOnly==0 then both the file itself and its metadata (file |
| 531 @@ -3265,28 +3314,23 @@ static int unixSync(sqlite3_file *id, int flags){ |
| 532 pFile->lastErrno = errno; |
| 533 return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); |
| 534 } |
| 535 - if( pFile->dirfd>=0 ){ |
| 536 - OSTRACE(("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd, |
| 537 + |
| 538 + /* Also fsync the directory containing the file if the DIRSYNC flag |
| 539 + ** is set. This is a one-time occurrance. Many systems (examples: AIX) |
| 540 + ** are unable to fsync a directory, so ignore errors on the fsync. |
| 541 + */ |
| 542 + if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ |
| 543 + int dirfd; |
| 544 + OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, |
| 545 HAVE_FULLFSYNC, isFullsync)); |
| 546 -#ifndef SQLITE_DISABLE_DIRSYNC |
| 547 - /* The directory sync is only attempted if full_fsync is |
| 548 - ** turned off or unavailable. If a full_fsync occurred above, |
| 549 - ** then the directory sync is superfluous. |
| 550 - */ |
| 551 - if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){ |
| 552 - /* |
| 553 - ** We have received multiple reports of fsync() returning |
| 554 - ** errors when applied to directories on certain file systems. |
| 555 - ** A failed directory sync is not a big deal. So it seems |
| 556 - ** better to ignore the error. Ticket #1657 |
| 557 - */ |
| 558 - /* pFile->lastErrno = errno; */ |
| 559 - /* return SQLITE_IOERR; */ |
| 560 + rc = osOpenDirectory(pFile->zPath, &dirfd); |
| 561 + if( rc==SQLITE_OK && dirfd>=0 ){ |
| 562 + full_fsync(dirfd, 0, 0); |
| 563 + robust_close(pFile, dirfd, __LINE__); |
| 564 + }else if( rc==SQLITE_CANTOPEN ){ |
| 565 + rc = SQLITE_OK; |
| 566 } |
| 567 -#endif |
| 568 - /* Only need to sync once, so close the directory when we are done */ |
| 569 - robust_close(pFile, pFile->dirfd, __LINE__); |
| 570 - pFile->dirfd = -1; |
| 571 + pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; |
| 572 } |
| 573 return rc; |
| 574 } |
| 575 @@ -4110,7 +4154,7 @@ static int unixShmUnmap( |
| 576 assert( pShmNode->nRef>0 ); |
| 577 pShmNode->nRef--; |
| 578 if( pShmNode->nRef==0 ){ |
| 579 - if( deleteFlag && pShmNode->h>=0 ) unlink(pShmNode->zFilename); |
| 580 + if( deleteFlag && pShmNode->h>=0 ) osUnlink(pShmNode->zFilename); |
| 581 unixShmPurge(pDbFd); |
| 582 } |
| 583 unixLeaveMutex(); |
| 584 @@ -4430,7 +4474,7 @@ void initUnixFile(sqlite3_file* file) { |
| 585 int fillInUnixFile( |
| 586 sqlite3_vfs *pVfs, /* Pointer to vfs object */ |
| 587 int h, /* Open file descriptor of file being opened */ |
| 588 - int dirfd, /* Directory file descriptor */ |
| 589 + int syncDir, /* True to sync directory on first sync */ |
| 590 sqlite3_file *pId, /* Write to the unixFile structure here */ |
| 591 const char *zFilename, /* Name of the file being opened */ |
| 592 int noLock, /* Omit locking if true */ |
| 593 @@ -4461,7 +4505,6 @@ int fillInUnixFile( |
| 594 |
| 595 OSTRACE(("OPEN %-3d %s\n", h, zFilename)); |
| 596 pNew->h = h; |
| 597 - pNew->dirfd = dirfd; |
| 598 pNew->zPath = zFilename; |
| 599 if( memcmp(pVfs->zName,"unix-excl",10)==0 ){ |
| 600 pNew->ctrlFlags = UNIXFILE_EXCL; |
| 601 @@ -4471,6 +4514,9 @@ int fillInUnixFile( |
| 602 if( isReadOnly ){ |
| 603 pNew->ctrlFlags |= UNIXFILE_RDONLY; |
| 604 } |
| 605 + if( syncDir ){ |
| 606 + pNew->ctrlFlags |= UNIXFILE_DIRSYNC; |
| 607 + } |
| 608 |
| 609 #if OS_VXWORKS |
| 610 pNew->pId = vxworksFindFileId(zFilename); |
| 611 @@ -4597,13 +4643,12 @@ int fillInUnixFile( |
| 612 if( rc!=SQLITE_OK ){ |
| 613 if( h>=0 ) robust_close(pNew, h, __LINE__); |
| 614 h = -1; |
| 615 - unlink(zFilename); |
| 616 + osUnlink(zFilename); |
| 617 isDelete = 0; |
| 618 } |
| 619 pNew->isDelete = isDelete; |
| 620 #endif |
| 621 if( rc!=SQLITE_OK ){ |
| 622 - if( dirfd>=0 ) robust_close(pNew, dirfd, __LINE__); |
| 623 if( h>=0 ) robust_close(pNew, h, __LINE__); |
| 624 }else{ |
| 625 pNew->pMethod = pLockingStyle; |
| 626 @@ -4613,37 +4658,6 @@ int fillInUnixFile( |
| 627 } |
| 628 |
| 629 /* |
| 630 -** Open a file descriptor to the directory containing file zFilename. |
| 631 -** If successful, *pFd is set to the opened file descriptor and |
| 632 -** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM |
| 633 -** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined |
| 634 -** value. |
| 635 -** |
| 636 -** If SQLITE_OK is returned, the caller is responsible for closing |
| 637 -** the file descriptor *pFd using close(). |
| 638 -*/ |
| 639 -static int openDirectory(const char *zFilename, int *pFd){ |
| 640 - int ii; |
| 641 - int fd = -1; |
| 642 - char zDirname[MAX_PATHNAME+1]; |
| 643 - |
| 644 - sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
| 645 - for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
| 646 - if( ii>0 ){ |
| 647 - zDirname[ii] = '\0'; |
| 648 - fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
| 649 - if( fd>=0 ){ |
| 650 -#ifdef FD_CLOEXEC |
| 651 - osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 652 -#endif |
| 653 - OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
| 654 - } |
| 655 - } |
| 656 - *pFd = fd; |
| 657 - return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname))
; |
| 658 -} |
| 659 - |
| 660 -/* |
| 661 ** Return the name of a directory in which to put temporary files. |
| 662 ** If no suitable temporary file directory can be found, return NULL. |
| 663 */ |
| 664 @@ -4938,7 +4952,6 @@ static int unixOpen( |
| 665 ){ |
| 666 unixFile *p = (unixFile *)pFile; |
| 667 int fd = -1; /* File descriptor returned by open() */ |
| 668 - int dirfd = -1; /* Directory file descriptor */ |
| 669 int openFlags = 0; /* Flags to pass to open() */ |
| 670 int eType = flags&0xFFFFFF00; /* Type of file to open */ |
| 671 int noLock; /* True to omit locking primitives */ |
| 672 @@ -4957,7 +4970,7 @@ static int unixOpen( |
| 673 ** a file-descriptor on the directory too. The first time unixSync() |
| 674 ** is called the directory file descriptor will be fsync()ed and close()d. |
| 675 */ |
| 676 - int isOpenDirectory = (isCreate && ( |
| 677 + int syncDir = (isCreate && ( |
| 678 eType==SQLITE_OPEN_MASTER_JOURNAL |
| 679 || eType==SQLITE_OPEN_MAIN_JOURNAL |
| 680 || eType==SQLITE_OPEN_WAL |
| 681 @@ -5004,7 +5017,7 @@ static int unixOpen( |
| 682 } |
| 683 }else if( !zName ){ |
| 684 /* If zName is NULL, the upper layer is requesting a temp file. */ |
| 685 - assert(isDelete && !isOpenDirectory); |
| 686 + assert(isDelete && !syncDir); |
| 687 rc = unixGetTempname(MAX_PATHNAME+1, zTmpname); |
| 688 if( rc!=SQLITE_OK ){ |
| 689 return rc; |
| 690 @@ -5057,7 +5070,7 @@ static int unixOpen( |
| 691 #if OS_VXWORKS |
| 692 zPath = zName; |
| 693 #else |
| 694 - unlink(zName); |
| 695 + osUnlink(zName); |
| 696 #endif |
| 697 } |
| 698 #if SQLITE_ENABLE_LOCKING_STYLE |
| 699 @@ -5066,19 +5079,6 @@ static int unixOpen( |
| 700 } |
| 701 #endif |
| 702 |
| 703 - if( isOpenDirectory ){ |
| 704 - rc = openDirectory(zPath, &dirfd); |
| 705 - if( rc!=SQLITE_OK ){ |
| 706 - /* It is safe to close fd at this point, because it is guaranteed not |
| 707 - ** to be open on a database file. If it were open on a database file, |
| 708 - ** it would not be safe to close as this would release any locks held |
| 709 - ** on the file by this process. */ |
| 710 - assert( eType!=SQLITE_OPEN_MAIN_DB ); |
| 711 - robust_close(p, fd, __LINE__); |
| 712 - goto open_finished; |
| 713 - } |
| 714 - } |
| 715 - |
| 716 #ifdef FD_CLOEXEC |
| 717 osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
| 718 #endif |
| 719 @@ -5090,7 +5090,6 @@ static int unixOpen( |
| 720 struct statfs fsInfo; |
| 721 if( fstatfs(fd, &fsInfo) == -1 ){ |
| 722 ((unixFile*)pFile)->lastErrno = errno; |
| 723 - if( dirfd>=0 ) robust_close(p, dirfd, __LINE__); |
| 724 robust_close(p, fd, __LINE__); |
| 725 return SQLITE_IOERR_ACCESS; |
| 726 } |
| 727 @@ -5122,9 +5121,6 @@ static int unixOpen( |
| 728 ** not while other file descriptors opened by the same process on |
| 729 ** the same file are working. */ |
| 730 p->lastErrno = errno; |
| 731 - if( dirfd>=0 ){ |
| 732 - robust_close(p, dirfd, __LINE__); |
| 733 - } |
| 734 robust_close(p, fd, __LINE__); |
| 735 rc = SQLITE_IOERR_ACCESS; |
| 736 goto open_finished; |
| 737 @@ -5132,7 +5128,7 @@ static int unixOpen( |
| 738 useProxy = !(fsInfo.f_flags&MNT_LOCAL); |
| 739 } |
| 740 if( useProxy ){ |
| 741 - rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, |
| 742 + rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, |
| 743 isDelete, isReadonly); |
| 744 if( rc==SQLITE_OK ){ |
| 745 rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); |
| 746 @@ -5150,7 +5146,7 @@ static int unixOpen( |
| 747 } |
| 748 #endif |
| 749 |
| 750 - rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, |
| 751 + rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, |
| 752 isDelete, isReadonly); |
| 753 open_finished: |
| 754 if( rc!=SQLITE_OK ){ |
| 755 @@ -5172,13 +5168,13 @@ static int unixDelete( |
| 756 int rc = SQLITE_OK; |
| 757 UNUSED_PARAMETER(NotUsed); |
| 758 SimulateIOError(return SQLITE_IOERR_DELETE); |
| 759 - if( unlink(zPath)==(-1) && errno!=ENOENT ){ |
| 760 + if( osUnlink(zPath)==(-1) && errno!=ENOENT ){ |
| 761 return unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); |
| 762 } |
| 763 #ifndef SQLITE_DISABLE_DIRSYNC |
| 764 if( dirSync ){ |
| 765 int fd; |
| 766 - rc = openDirectory(zPath, &fd); |
| 767 + rc = osOpenDirectory(zPath, &fd); |
| 768 if( rc==SQLITE_OK ){ |
| 769 #if OS_VXWORKS |
| 770 if( fsync(fd)==-1 ) |
| 771 @@ -5189,6 +5185,8 @@ static int unixDelete( |
| 772 rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); |
| 773 } |
| 774 robust_close(0, fd, __LINE__); |
| 775 + }else if( rc==SQLITE_CANTOPEN ){ |
| 776 + rc = SQLITE_OK; |
| 777 } |
| 778 } |
| 779 #endif |
| 780 @@ -5750,7 +5748,6 @@ static int proxyCreateUnixFile( |
| 781 int islockfile /* if non zero missing dirs will be created */ |
| 782 ) { |
| 783 int fd = -1; |
| 784 - int dirfd = -1; |
| 785 unixFile *pNew; |
| 786 int rc = SQLITE_OK; |
| 787 int openFlags = O_RDWR | O_CREAT; |
| 788 @@ -5815,7 +5812,7 @@ static int proxyCreateUnixFile( |
| 789 pUnused->flags = openFlags; |
| 790 pNew->pUnused = pUnused; |
| 791 |
| 792 - rc = fillInUnixFile(&dummyVfs, fd, dirfd, (sqlite3_file*)pNew, path, 0, 0, 0)
; |
| 793 + rc = fillInUnixFile(&dummyVfs, fd, 0, (sqlite3_file*)pNew, path, 0, 0, 0); |
| 794 if( rc==SQLITE_OK ){ |
| 795 *ppFile = pNew; |
| 796 return SQLITE_OK; |
| 797 @@ -5929,7 +5926,7 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t myH
ostID){ |
| 798 end_breaklock: |
| 799 if( rc ){ |
| 800 if( fd>=0 ){ |
| 801 - unlink(tPath); |
| 802 + osUnlink(tPath); |
| 803 robust_close(pFile, fd, __LINE__); |
| 804 } |
| 805 fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg); |
| 806 @@ -6752,7 +6749,7 @@ int sqlite3_os_init(void){ |
| 807 |
| 808 /* Double-check that the aSyscall[] array has been constructed |
| 809 ** correctly. See ticket [bb3a86e890c8e96ab] */ |
| 810 - assert( ArraySize(aSyscall)==16 ); |
| 811 + assert( ArraySize(aSyscall)==18 ); |
| 812 |
| 813 /* Register all VFSes defined in the aVfs[] array */ |
| 814 for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ |
| 815 diff --git a/third_party/sqlite/src/test/syscall.test b/third_party/sqlite/src/t
est/syscall.test |
| 816 index 4442612..201bd63 100644 |
| 817 --- a/third_party/sqlite/src/test/syscall.test |
| 818 +++ b/third_party/sqlite/src/test/syscall.test |
| 819 @@ -59,7 +59,7 @@ do_test 2.1.2 { test_syscall exists nosuchcall } 0 |
| 820 foreach s { |
| 821 open close access getcwd stat fstat ftruncate |
| 822 fcntl read pread write pwrite fchmod fallocate |
| 823 - pread64 pwrite64 |
| 824 + pread64 pwrite64 unlink openDirectory |
| 825 } { |
| 826 if {[test_syscall exists $s]} {lappend syscall_list $s} |
| 827 } |
| 828 diff --git a/third_party/sqlite/system-sqlite.patch b/third_party/sqlite/system-
sqlite.patch |
| 829 index f61f019..31d6b00 100644 |
| 830 --- a/third_party/sqlite/system-sqlite.patch |
| 831 +++ b/third_party/sqlite/system-sqlite.patch |
| 832 @@ -1,48 +0,0 @@ |
| 833 -This is a backport of http://sqlite.org/src/ci/9109128cb5, |
| 834 -which is needed for experiments with using unpatched sqlite. |
| 835 -If you hit a merge conflict on this file it is most likely |
| 836 -that you've upgraded to version of sqlite that includes this patch. |
| 837 -Index: src/os_unix.c |
| 838 -=================================================================== |
| 839 ---- src/os_unix.c |
| 840 -+++ src/os_unix.c |
| 841 -@@ -4787,11 +4787,11 @@ |
| 842 - ** ignored and -1 is returned. The caller will try to open a new file |
| 843 - ** descriptor on the same path, fail, and return an error to SQLite. |
| 844 - ** |
| 845 - ** Even if a subsequent open() call does succeed, the consequences of |
| 846 - ** not searching for a resusable file descriptor are not dire. */ |
| 847 -- if( 0==stat(zPath, &sStat) ){ |
| 848 -+ if( 0==osStat(zPath, &sStat) ){ |
| 849 - unixInodeInfo *pInode; |
| 850 - |
| 851 - unixEnterMutex(); |
| 852 - pInode = inodeList; |
| 853 - while( pInode && (pInode->fileId.dev!=sStat.st_dev |
| 854 -@@ -4863,11 +4863,11 @@ |
| 855 - while( nDb>0 && zPath[nDb]!='-' ) nDb--; |
| 856 - if( nDb==0 ) return SQLITE_OK; |
| 857 - memcpy(zDb, zPath, nDb); |
| 858 - zDb[nDb] = '\0'; |
| 859 - |
| 860 -- if( 0==stat(zDb, &sStat) ){ |
| 861 -+ if( 0==osStat(zDb, &sStat) ){ |
| 862 - *pMode = sStat.st_mode & 0777; |
| 863 - }else{ |
| 864 - rc = SQLITE_IOERR_FSTAT; |
| 865 - } |
| 866 - }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ |
| 867 -@@ -5208,11 +5208,11 @@ |
| 868 - assert(!"Invalid flags argument"); |
| 869 - } |
| 870 - *pResOut = (osAccess(zPath, amode)==0); |
| 871 - if( flags==SQLITE_ACCESS_EXISTS && *pResOut ){ |
| 872 - struct stat buf; |
| 873 -- if( 0==stat(zPath, &buf) && buf.st_size==0 ){ |
| 874 -+ if( 0==osStat(zPath, &buf) && buf.st_size==0 ){ |
| 875 - *pResOut = 0; |
| 876 - } |
| 877 - } |
| 878 - return SQLITE_OK; |
| 879 - } |
| 880 - |
OLD | NEW |