Index: third_party/sqlite/patches/0007-backport-SQLite-os-intercept-changes.patch |
diff --git a/third_party/sqlite/patches/0007-backport-SQLite-os-intercept-changes.patch b/third_party/sqlite/patches/0007-backport-SQLite-os-intercept-changes.patch |
deleted file mode 100644 |
index 8a3fb199e3c7c079ffdd2b49a22b1682cc2d9b62..0000000000000000000000000000000000000000 |
--- a/third_party/sqlite/patches/0007-backport-SQLite-os-intercept-changes.patch |
+++ /dev/null |
@@ -1,475 +0,0 @@ |
-From 82b8b2c69979f0e1d93577f40597c826d8f8c2ee Mon Sep 17 00:00:00 2001 |
-From: =?UTF-8?q?Pawe=C5=82=20Hajdan=20Jr?= <phajdan.jr@chromium.org> |
-Date: Fri, 5 Aug 2011 16:17:40 +0000 |
-Subject: [PATCH 07/23] [backport] SQLite os-intercept changes. |
- |
-This is a backport of the following SQLite changes to experiment with |
-implementing WebDatabase with an unpatched SQLite: |
- |
-1. http://sqlite.org/src/ci/9109128cb5 |
-2. http://sqlite.org/src/ci/713b1b7dc1 |
-3. http://sqlite.org/src/ci/8d1b5c3ac0 |
-4. http://sqlite.org/src/ci/6b236069e1 |
-5. http://sqlite.org/src/ci/880b51150a |
- |
-BUG=22208 |
- |
-Original review URLs: |
-http://codereview.chromium.org/7575027 |
-http://codereview.chromium.org/7629003 |
-[Possibly more] |
---- |
- third_party/sqlite/src/src/os_unix.c | 187 +++++++++++++++---------------- |
- third_party/sqlite/src/test/syscall.test | 2 +- |
- 2 files changed, 93 insertions(+), 96 deletions(-) |
- |
-diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c |
-index 766b52a..77ffd8a 100644 |
---- a/third_party/sqlite/src/src/os_unix.c |
-+++ b/third_party/sqlite/src/src/os_unix.c |
-@@ -204,7 +204,6 @@ struct unixFile { |
- sqlite3_io_methods const *pMethod; /* Always the first entry */ |
- unixInodeInfo *pInode; /* Info about locks on this inode */ |
- int h; /* The file descriptor */ |
-- int dirfd; /* File descriptor for the directory */ |
- unsigned char eFileLock; /* The type of lock held on this fd */ |
- unsigned char ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ |
- int lastErrno; /* The unix errno from last I/O error */ |
-@@ -248,6 +247,7 @@ struct unixFile { |
- */ |
- #define UNIXFILE_EXCL 0x01 /* Connections from one process only */ |
- #define UNIXFILE_RDONLY 0x02 /* Connection is read only */ |
-+#define UNIXFILE_DIRSYNC 0x04 /* Directory sync needed */ |
- |
- /* |
- ** Include code that is common to all os_*.c files |
-@@ -281,6 +281,9 @@ struct unixFile { |
- #define threadid 0 |
- #endif |
- |
-+/* Forward reference */ |
-+static int openDirectory(const char*, int*); |
-+ |
- /* |
- ** Many system calls are accessed through pointer-to-functions so that |
- ** they may be overridden at runtime to facilitate fault injection during |
-@@ -377,6 +380,12 @@ static struct unix_syscall { |
- #endif |
- #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent) |
- |
-+ { "unlink", (sqlite3_syscall_ptr)unlink, 0 }, |
-+#define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent) |
-+ |
-+ { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, |
-+#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) |
-+ |
- }; /* End of the overrideable system calls */ |
- |
- /* |
-@@ -1731,10 +1740,6 @@ static int unixUnlock(sqlite3_file *id, int eFileLock){ |
- */ |
- static int closeUnixFile(sqlite3_file *id){ |
- unixFile *pFile = (unixFile*)id; |
-- if( pFile->dirfd>=0 ){ |
-- robust_close(pFile, pFile->dirfd, __LINE__); |
-- pFile->dirfd=-1; |
-- } |
- if( pFile->h>=0 ){ |
- robust_close(pFile, pFile->h, __LINE__); |
- pFile->h = -1; |
-@@ -1742,7 +1747,7 @@ static int closeUnixFile(sqlite3_file *id){ |
- #if OS_VXWORKS |
- if( pFile->pId ){ |
- if( pFile->isDelete ){ |
-- unlink(pFile->pId->zCanonicalName); |
-+ osUnlink(pFile->pId->zCanonicalName); |
- } |
- vxworksReleaseFileId(pFile->pId); |
- pFile->pId = 0; |
-@@ -1989,7 +1994,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { |
- |
- /* To fully unlock the database, delete the lock file */ |
- assert( eFileLock==NO_LOCK ); |
-- if( unlink(zLockFile) ){ |
-+ if( osUnlink(zLockFile) ){ |
- int rc = 0; |
- int tErrno = errno; |
- if( ENOENT != tErrno ){ |
-@@ -3226,6 +3231,50 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ |
- } |
- |
- /* |
-+** Open a file descriptor to the directory containing file zFilename. |
-+** If successful, *pFd is set to the opened file descriptor and |
-+** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM |
-+** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined |
-+** value. |
-+** |
-+** The directory file descriptor is used for only one thing - to |
-+** fsync() a directory to make sure file creation and deletion events |
-+** are flushed to disk. Such fsyncs are not needed on newer |
-+** journaling filesystems, but are required on older filesystems. |
-+** |
-+** This routine can be overridden using the xSetSysCall interface. |
-+** The ability to override this routine was added in support of the |
-+** chromium sandbox. Opening a directory is a security risk (we are |
-+** told) so making it overrideable allows the chromium sandbox to |
-+** replace this routine with a harmless no-op. To make this routine |
-+** a no-op, replace it with a stub that returns SQLITE_OK but leaves |
-+** *pFd set to a negative number. |
-+** |
-+** If SQLITE_OK is returned, the caller is responsible for closing |
-+** the file descriptor *pFd using close(). |
-+*/ |
-+static int openDirectory(const char *zFilename, int *pFd){ |
-+ int ii; |
-+ int fd = -1; |
-+ char zDirname[MAX_PATHNAME+1]; |
-+ |
-+ sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
-+ for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
-+ if( ii>0 ){ |
-+ zDirname[ii] = '\0'; |
-+ fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
-+ if( fd>=0 ){ |
-+#ifdef FD_CLOEXEC |
-+ osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
-+#endif |
-+ OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
-+ } |
-+ } |
-+ *pFd = fd; |
-+ return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname)); |
-+} |
-+ |
-+/* |
- ** Make sure all writes to a particular file are committed to disk. |
- ** |
- ** If dataOnly==0 then both the file itself and its metadata (file |
-@@ -3265,28 +3314,23 @@ static int unixSync(sqlite3_file *id, int flags){ |
- pFile->lastErrno = errno; |
- return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); |
- } |
-- if( pFile->dirfd>=0 ){ |
-- OSTRACE(("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd, |
-+ |
-+ /* Also fsync the directory containing the file if the DIRSYNC flag |
-+ ** is set. This is a one-time occurrance. Many systems (examples: AIX) |
-+ ** are unable to fsync a directory, so ignore errors on the fsync. |
-+ */ |
-+ if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){ |
-+ int dirfd; |
-+ OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, |
- HAVE_FULLFSYNC, isFullsync)); |
--#ifndef SQLITE_DISABLE_DIRSYNC |
-- /* The directory sync is only attempted if full_fsync is |
-- ** turned off or unavailable. If a full_fsync occurred above, |
-- ** then the directory sync is superfluous. |
-- */ |
-- if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){ |
-- /* |
-- ** We have received multiple reports of fsync() returning |
-- ** errors when applied to directories on certain file systems. |
-- ** A failed directory sync is not a big deal. So it seems |
-- ** better to ignore the error. Ticket #1657 |
-- */ |
-- /* pFile->lastErrno = errno; */ |
-- /* return SQLITE_IOERR; */ |
-+ rc = osOpenDirectory(pFile->zPath, &dirfd); |
-+ if( rc==SQLITE_OK && dirfd>=0 ){ |
-+ full_fsync(dirfd, 0, 0); |
-+ robust_close(pFile, dirfd, __LINE__); |
-+ }else if( rc==SQLITE_CANTOPEN ){ |
-+ rc = SQLITE_OK; |
- } |
--#endif |
-- /* Only need to sync once, so close the directory when we are done */ |
-- robust_close(pFile, pFile->dirfd, __LINE__); |
-- pFile->dirfd = -1; |
-+ pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; |
- } |
- return rc; |
- } |
-@@ -4110,7 +4154,7 @@ static int unixShmUnmap( |
- assert( pShmNode->nRef>0 ); |
- pShmNode->nRef--; |
- if( pShmNode->nRef==0 ){ |
-- if( deleteFlag && pShmNode->h>=0 ) unlink(pShmNode->zFilename); |
-+ if( deleteFlag && pShmNode->h>=0 ) osUnlink(pShmNode->zFilename); |
- unixShmPurge(pDbFd); |
- } |
- unixLeaveMutex(); |
-@@ -4430,7 +4474,7 @@ void initUnixFile(sqlite3_file* file) { |
- int fillInUnixFile( |
- sqlite3_vfs *pVfs, /* Pointer to vfs object */ |
- int h, /* Open file descriptor of file being opened */ |
-- int dirfd, /* Directory file descriptor */ |
-+ int syncDir, /* True to sync directory on first sync */ |
- sqlite3_file *pId, /* Write to the unixFile structure here */ |
- const char *zFilename, /* Name of the file being opened */ |
- int noLock, /* Omit locking if true */ |
-@@ -4461,7 +4505,6 @@ int fillInUnixFile( |
- |
- OSTRACE(("OPEN %-3d %s\n", h, zFilename)); |
- pNew->h = h; |
-- pNew->dirfd = dirfd; |
- pNew->zPath = zFilename; |
- if( strcmp(pVfs->zName,"unix-excl")==0 ){ |
- pNew->ctrlFlags = UNIXFILE_EXCL; |
-@@ -4471,6 +4514,9 @@ int fillInUnixFile( |
- if( isReadOnly ){ |
- pNew->ctrlFlags |= UNIXFILE_RDONLY; |
- } |
-+ if( syncDir ){ |
-+ pNew->ctrlFlags |= UNIXFILE_DIRSYNC; |
-+ } |
- |
- #if OS_VXWORKS |
- pNew->pId = vxworksFindFileId(zFilename); |
-@@ -4597,13 +4643,12 @@ int fillInUnixFile( |
- if( rc!=SQLITE_OK ){ |
- if( h>=0 ) robust_close(pNew, h, __LINE__); |
- h = -1; |
-- unlink(zFilename); |
-+ osUnlink(zFilename); |
- isDelete = 0; |
- } |
- pNew->isDelete = isDelete; |
- #endif |
- if( rc!=SQLITE_OK ){ |
-- if( dirfd>=0 ) robust_close(pNew, dirfd, __LINE__); |
- if( h>=0 ) robust_close(pNew, h, __LINE__); |
- }else{ |
- pNew->pMethod = pLockingStyle; |
-@@ -4613,37 +4658,6 @@ int fillInUnixFile( |
- } |
- |
- /* |
--** Open a file descriptor to the directory containing file zFilename. |
--** If successful, *pFd is set to the opened file descriptor and |
--** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM |
--** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined |
--** value. |
--** |
--** If SQLITE_OK is returned, the caller is responsible for closing |
--** the file descriptor *pFd using close(). |
--*/ |
--static int openDirectory(const char *zFilename, int *pFd){ |
-- int ii; |
-- int fd = -1; |
-- char zDirname[MAX_PATHNAME+1]; |
-- |
-- sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); |
-- for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); |
-- if( ii>0 ){ |
-- zDirname[ii] = '\0'; |
-- fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); |
-- if( fd>=0 ){ |
--#ifdef FD_CLOEXEC |
-- osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
--#endif |
-- OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); |
-- } |
-- } |
-- *pFd = fd; |
-- return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname)); |
--} |
-- |
--/* |
- ** Return the name of a directory in which to put temporary files. |
- ** If no suitable temporary file directory can be found, return NULL. |
- */ |
-@@ -4757,7 +4771,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ |
- ** |
- ** Even if a subsequent open() call does succeed, the consequences of |
- ** not searching for a resusable file descriptor are not dire. */ |
-- if( 0==stat(zPath, &sStat) ){ |
-+ if( 0==osStat(zPath, &sStat) ){ |
- unixInodeInfo *pInode; |
- |
- unixEnterMutex(); |
-@@ -4827,7 +4841,7 @@ static int findCreateFileMode( |
- memcpy(zDb, zPath, nDb); |
- zDb[nDb] = '\0'; |
- |
-- if( 0==stat(zDb, &sStat) ){ |
-+ if( 0==osStat(zDb, &sStat) ){ |
- *pMode = sStat.st_mode & 0777; |
- }else{ |
- rc = SQLITE_IOERR_FSTAT; |
-@@ -4938,7 +4952,6 @@ static int unixOpen( |
- ){ |
- unixFile *p = (unixFile *)pFile; |
- int fd = -1; /* File descriptor returned by open() */ |
-- int dirfd = -1; /* Directory file descriptor */ |
- int openFlags = 0; /* Flags to pass to open() */ |
- int eType = flags&0xFFFFFF00; /* Type of file to open */ |
- int noLock; /* True to omit locking primitives */ |
-@@ -4957,7 +4970,7 @@ static int unixOpen( |
- ** a file-descriptor on the directory too. The first time unixSync() |
- ** is called the directory file descriptor will be fsync()ed and close()d. |
- */ |
-- int isOpenDirectory = (isCreate && ( |
-+ int syncDir = (isCreate && ( |
- eType==SQLITE_OPEN_MASTER_JOURNAL |
- || eType==SQLITE_OPEN_MAIN_JOURNAL |
- || eType==SQLITE_OPEN_WAL |
-@@ -5004,7 +5017,7 @@ static int unixOpen( |
- } |
- }else if( !zName ){ |
- /* If zName is NULL, the upper layer is requesting a temp file. */ |
-- assert(isDelete && !isOpenDirectory); |
-+ assert(isDelete && !syncDir); |
- rc = unixGetTempname(MAX_PATHNAME+1, zTmpname); |
- if( rc!=SQLITE_OK ){ |
- return rc; |
-@@ -5057,7 +5070,7 @@ static int unixOpen( |
- #if OS_VXWORKS |
- zPath = zName; |
- #else |
-- unlink(zName); |
-+ osUnlink(zName); |
- #endif |
- } |
- #if SQLITE_ENABLE_LOCKING_STYLE |
-@@ -5066,19 +5079,6 @@ static int unixOpen( |
- } |
- #endif |
- |
-- if( isOpenDirectory ){ |
-- rc = openDirectory(zPath, &dirfd); |
-- if( rc!=SQLITE_OK ){ |
-- /* It is safe to close fd at this point, because it is guaranteed not |
-- ** to be open on a database file. If it were open on a database file, |
-- ** it would not be safe to close as this would release any locks held |
-- ** on the file by this process. */ |
-- assert( eType!=SQLITE_OPEN_MAIN_DB ); |
-- robust_close(p, fd, __LINE__); |
-- goto open_finished; |
-- } |
-- } |
-- |
- #ifdef FD_CLOEXEC |
- osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC); |
- #endif |
-@@ -5090,7 +5090,6 @@ static int unixOpen( |
- struct statfs fsInfo; |
- if( fstatfs(fd, &fsInfo) == -1 ){ |
- ((unixFile*)pFile)->lastErrno = errno; |
-- if( dirfd>=0 ) robust_close(p, dirfd, __LINE__); |
- robust_close(p, fd, __LINE__); |
- return SQLITE_IOERR_ACCESS; |
- } |
-@@ -5122,9 +5121,6 @@ static int unixOpen( |
- ** not while other file descriptors opened by the same process on |
- ** the same file are working. */ |
- p->lastErrno = errno; |
-- if( dirfd>=0 ){ |
-- robust_close(p, dirfd, __LINE__); |
-- } |
- robust_close(p, fd, __LINE__); |
- rc = SQLITE_IOERR_ACCESS; |
- goto open_finished; |
-@@ -5132,7 +5128,7 @@ static int unixOpen( |
- useProxy = !(fsInfo.f_flags&MNT_LOCAL); |
- } |
- if( useProxy ){ |
-- rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, |
-+ rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, |
- isDelete, isReadonly); |
- if( rc==SQLITE_OK ){ |
- rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); |
-@@ -5150,7 +5146,7 @@ static int unixOpen( |
- } |
- #endif |
- |
-- rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, |
-+ rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, |
- isDelete, isReadonly); |
- open_finished: |
- if( rc!=SQLITE_OK ){ |
-@@ -5172,13 +5168,13 @@ static int unixDelete( |
- int rc = SQLITE_OK; |
- UNUSED_PARAMETER(NotUsed); |
- SimulateIOError(return SQLITE_IOERR_DELETE); |
-- if( unlink(zPath)==(-1) && errno!=ENOENT ){ |
-+ if( osUnlink(zPath)==(-1) && errno!=ENOENT ){ |
- return unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); |
- } |
- #ifndef SQLITE_DISABLE_DIRSYNC |
- if( dirSync ){ |
- int fd; |
-- rc = openDirectory(zPath, &fd); |
-+ rc = osOpenDirectory(zPath, &fd); |
- if( rc==SQLITE_OK ){ |
- #if OS_VXWORKS |
- if( fsync(fd)==-1 ) |
-@@ -5189,6 +5185,8 @@ static int unixDelete( |
- rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); |
- } |
- robust_close(0, fd, __LINE__); |
-+ }else if( rc==SQLITE_CANTOPEN ){ |
-+ rc = SQLITE_OK; |
- } |
- } |
- #endif |
-@@ -5231,7 +5229,7 @@ static int unixAccess( |
- *pResOut = (osAccess(zPath, amode)==0); |
- if( flags==SQLITE_ACCESS_EXISTS && *pResOut ){ |
- struct stat buf; |
-- if( 0==stat(zPath, &buf) && buf.st_size==0 ){ |
-+ if( 0==osStat(zPath, &buf) && buf.st_size==0 ){ |
- *pResOut = 0; |
- } |
- } |
-@@ -5750,7 +5748,6 @@ static int proxyCreateUnixFile( |
- int islockfile /* if non zero missing dirs will be created */ |
- ) { |
- int fd = -1; |
-- int dirfd = -1; |
- unixFile *pNew; |
- int rc = SQLITE_OK; |
- int openFlags = O_RDWR | O_CREAT; |
-@@ -5815,7 +5812,7 @@ static int proxyCreateUnixFile( |
- pUnused->flags = openFlags; |
- pNew->pUnused = pUnused; |
- |
-- rc = fillInUnixFile(&dummyVfs, fd, dirfd, (sqlite3_file*)pNew, path, 0, 0, 0); |
-+ rc = fillInUnixFile(&dummyVfs, fd, 0, (sqlite3_file*)pNew, path, 0, 0, 0); |
- if( rc==SQLITE_OK ){ |
- *ppFile = pNew; |
- return SQLITE_OK; |
-@@ -5929,7 +5926,7 @@ static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){ |
- end_breaklock: |
- if( rc ){ |
- if( fd>=0 ){ |
-- unlink(tPath); |
-+ osUnlink(tPath); |
- robust_close(pFile, fd, __LINE__); |
- } |
- fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg); |
-@@ -6752,7 +6749,7 @@ int sqlite3_os_init(void){ |
- |
- /* Double-check that the aSyscall[] array has been constructed |
- ** correctly. See ticket [bb3a86e890c8e96ab] */ |
-- assert( ArraySize(aSyscall)==16 ); |
-+ assert( ArraySize(aSyscall)==18 ); |
- |
- /* Register all VFSes defined in the aVfs[] array */ |
- for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ |
-diff --git a/third_party/sqlite/src/test/syscall.test b/third_party/sqlite/src/test/syscall.test |
-index 4442612..201bd63 100644 |
---- a/third_party/sqlite/src/test/syscall.test |
-+++ b/third_party/sqlite/src/test/syscall.test |
-@@ -59,7 +59,7 @@ do_test 2.1.2 { test_syscall exists nosuchcall } 0 |
- foreach s { |
- open close access getcwd stat fstat ftruncate |
- fcntl read pread write pwrite fchmod fallocate |
-- pread64 pwrite64 |
-+ pread64 pwrite64 unlink openDirectory |
- } { |
- if {[test_syscall exists $s]} {lappend syscall_list $s} |
- } |
--- |
-2.2.1 |
- |