Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp

Issue 1012353002: Fix WebSQL error on sandboxed OSX and Linux. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
diff --git a/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp b/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
index 9b85a6e74cdfe761ad82bffc5ac4225bdb178634..fef04088f1bfacd9092a17f1684592d83be72ed5 100644
--- a/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
+++ b/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
@@ -52,6 +52,93 @@ namespace blink {
// Chromium's Posix implementation of SQLite VFS
namespace {
+struct chromiumVfsFile {
+ sqlite3_io_methods* pMethods;
+ sqlite3_file* realFile;
+ char* fileName;
+};
+
+int chromiumClose(sqlite3_file* fi)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ int r = f->realFile->pMethods->xClose(f->realFile);
+ sqlite3_free(f->fileName);
+ sqlite3_free(f->realFile);
+ memset(f, 0, sizeof(*f));
+ return r;
+}
+
+int chromiumRead(sqlite3_file* fi, void* pBuf, int iAmt, sqlite3_int64 iOfst)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xRead(f->realFile, pBuf, iAmt, iOfst);
+}
+
+int chromiumWrite(sqlite3_file* fi, const void* pBuf, int iAmt, sqlite3_int64 iOfst)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xWrite(f->realFile, pBuf, iAmt, iOfst);
+}
+
+int chromiumTruncate(sqlite3_file* fi, sqlite3_int64 size)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+
+ // The OSX and Linux sandboxes block ftruncate(), proxy to the browser
+ // process.
+ if (Platform::current()->databaseSetFileSize(String(f->fileName), size))
+ return SQLITE_OK;
+ return SQLITE_IOERR_TRUNCATE;
+}
+
+int chromiumSync(sqlite3_file* fi, int flags)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xSync(f->realFile, flags);
+}
+
+int chromiumFileSize(sqlite3_file* fi, sqlite3_int64 *pSize)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xFileSize(f->realFile, pSize);
+}
+
+int chromiumLock(sqlite3_file* fi, int eFileLock)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xLock(f->realFile, eFileLock);
+}
+
+int chromiumUnlock(sqlite3_file* fi, int eFileLock)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xUnlock(f->realFile, eFileLock);
+}
+
+int chromiumCheckReservedLock(sqlite3_file* fi, int *pResOut)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xCheckReservedLock(f->realFile, pResOut);
+}
+
+int chromiumFileControl(sqlite3_file* fi, int op, void *pArg)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xFileControl(f->realFile, op, pArg);
+}
+
+int chromiumSectorSize(sqlite3_file* fi)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xSectorSize(f->realFile);
+}
+
+int chromiumDeviceCharacteristics(sqlite3_file* fi)
+{
+ chromiumVfsFile* f = (chromiumVfsFile*)fi;
+ return f->realFile->pMethods->xDeviceCharacteristics(f->realFile);
+}
+
// Opens a file.
//
// vfs - pointer to the sqlite3_vfs object.
@@ -59,8 +146,8 @@ namespace {
// id - the structure that will manipulate the newly opened file.
// desiredFlags - the desired open mode flags.
// usedFlags - the actual open mode flags that were used.
-int chromiumOpen(sqlite3_vfs* vfs, const char* fileName,
- sqlite3_file* id, int desiredFlags, int* usedFlags)
+int chromiumOpenInternal(sqlite3_vfs* vfs, const char* fileName,
+ sqlite3_file* id, int desiredFlags, int* usedFlags)
Scott Hess - ex-Googler 2015/03/18 01:45:46 Still figuring out why this indentation is throwin
michaeln 2015/03/19 00:14:04 probably it predates the tool and the checks
Scott Hess - ex-Googler 2015/03/25 20:19:55 Looks like I can just not wrap it...
{
chromium_sqlite3_initialize_unix_sqlite3_file(id);
int fd = -1;
@@ -95,6 +182,61 @@ int chromiumOpen(sqlite3_vfs* vfs, const char* fileName,
return result;
}
+// SQLite allocates a buffer using szOsFile then calls xOpen() on it. registerSQLiteVFS() caches the size of the "unix"
+// vfs structure for use by chromiumOpen().
+static size_t szUnixFile = 0;
+
+int chromiumOpen(sqlite3_vfs* vfs, const char* fileName,
+ sqlite3_file* id, int desiredFlags, int* usedFlags)
Scott Hess - ex-Googler 2015/03/18 01:45:46 This indentation is throwing pre-submit complaints
+{
+ // registerSQLiteVFS() never happened.
+ if (!szUnixFile)
+ return SQLITE_ERROR;
+
+ sqlite3_file* realFile = (sqlite3_file*)sqlite3_malloc(szUnixFile);
+ if (!realFile)
+ return SQLITE_NOMEM;
+
+ // Make a local copy of the file name. SQLite's os_unix.c appears to be written to allow caching the pointer passed
+ // in to this function, but that seems brittle.
+ char* realFileName = sqlite3_mprintf("%s", fileName);
+ if (!realFileName) {
+ sqlite3_free(realFile);
+ return SQLITE_NOMEM;
+ }
+
+ // SQLite's unixOpen() makes assumptions about the structure of |fileName|. Our local copy may not answer those
+ // assumptions correctly.
+ int rc = chromiumOpenInternal(vfs, fileName, realFile, desiredFlags, usedFlags);
+ if (rc != SQLITE_OK) {
+ sqlite3_free(realFileName);
+ sqlite3_free(realFile);
+ return rc;
+ }
+
+ static sqlite3_io_methods chromiumIoMethods = {
+ 1,
+ chromiumClose,
+ chromiumRead,
+ chromiumWrite,
+ chromiumTruncate,
+ chromiumSync,
+ chromiumFileSize,
+ chromiumLock,
+ chromiumUnlock,
+ chromiumCheckReservedLock,
+ chromiumFileControl,
+ chromiumSectorSize,
+ chromiumDeviceCharacteristics,
+ // Methods above are valid for version 1.
michaeln 2015/03/19 00:14:04 Looks like the default posix io methods provides t
Scott Hess - ex-Googler 2015/03/25 20:19:55 My understanding is that the version-2 bits are fo
+ };
+ chromiumVfsFile* f = (chromiumVfsFile*)id;
+ f->pMethods = &chromiumIoMethods;
+ f->realFile = realFile;
+ f->fileName = realFileName;
+ return SQLITE_OK;
+}
+
// Deletes the given file.
//
// vfs - pointer to the sqlite3_vfs object.
@@ -169,9 +311,10 @@ void* chromiumDlOpen(sqlite3_vfs*, const char*)
void SQLiteFileSystem::registerSQLiteVFS()
{
sqlite3_vfs* unix_vfs = sqlite3_vfs_find("unix");
+ szUnixFile = unix_vfs->szOsFile;
static sqlite3_vfs chromium_vfs = {
1,
- unix_vfs->szOsFile,
+ sizeof(chromiumVfsFile),
unix_vfs->mxPathname,
0,
"chromium_vfs",

Powered by Google App Engine
This is Rietveld 408576698