1 This is a backport of the following sqlite changes: 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. 10 If you hit a merge conflict on this file it is most likely 11 that you've upgraded to version of sqlite that includes those patches. 12 diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amalgamation/sqlite3.c 13 index 3e794a9..73ff15f 100644 14 --- a/third_party/sqlite/amalgamation/sqlite3.c 15 +++ b/third_party/sqlite/amalgamation/sqlite3.c 16 @@ -24144,7 +24144,6 @@ struct unixFile { 17 sqlite3_io_methods const *pMethod; /* Always the first entry */ 18 unixInodeInfo *pInode; /* Info about locks on this inode */ 19 int h; /* The file descriptor */ 20 - int dirfd; /* File descriptor for the directory */ 21 unsigned char eFileLock; /* The type of lock held on this fd */ 22 unsigned char ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ 23 int lastErrno; /* The unix errno from last I/O error */ 24 @@ -24188,6 +24187,7 @@ struct unixFile { 25 */ 26 #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ 27 #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ 28 +#define UNIXFILE_DIRSYNC 0x04 /* Directory sync needed */ 29 30 /* 31 ** Include code that is common to all os_*.c files 32 @@ -24426,6 +24426,9 @@ SQLITE_API int sqlite3_open_file_count = 0; 33 #define threadid 0 34 #endif 35 36 +/* Forward reference */ 37 +static int openDirectory(const char*, int*); 38 + 39 /* 40 ** Many system calls are accessed through pointer-to-functions so that 41 ** they may be overridden at runtime to facilitate fault injection during 42 @@ -24522,6 +24525,12 @@ static struct unix_syscall { 43 #endif 44 #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) 45 46 + { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, 47 +#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) 48 + 49 + { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, 50 +#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) 51 + 52 }; /* End of the overrideable system calls */ 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 dataOnly){ 85 } 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 myHostID){ 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/os_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 myHostID){ 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/test/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 - 881