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

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: test-authorizer-expected.txt also fixed! Created 5 years, 8 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
« no previous file with comments | « LayoutTests/platform/mac/storage/websql/test-authorizer-expected.txt ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
diff --git a/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp b/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp
index e2e57aa633ea53237bb23b54aa3cf075db159c15..3a96c0e959ccdd904ef60432d1e04b90e051a31e 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* wrappedFile;
+ char* wrappedFileName;
+};
+
+int chromiumClose(sqlite3_file* sqliteFile)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ int r = chromiumFile->wrappedFile->pMethods->xClose(chromiumFile->wrappedFile);
+ sqlite3_free(chromiumFile->wrappedFileName);
+ sqlite3_free(chromiumFile->wrappedFile);
+ memset(chromiumFile, 0, sizeof(*chromiumFile));
+ return r;
+}
+
+int chromiumRead(sqlite3_file* sqliteFile, void* pBuf, int iAmt, sqlite3_int64 iOfst)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xRead(chromiumFile->wrappedFile, pBuf, iAmt, iOfst);
+}
+
+int chromiumWrite(sqlite3_file* sqliteFile, const void* pBuf, int iAmt, sqlite3_int64 iOfst)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xWrite(chromiumFile->wrappedFile, pBuf, iAmt, iOfst);
+}
+
+int chromiumTruncate(sqlite3_file* sqliteFile, sqlite3_int64 size)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+
+ // The OSX and Linux sandboxes block ftruncate(), proxy to the browser
+ // process.
+ if (Platform::current()->databaseSetFileSize(String(chromiumFile->wrappedFileName), size))
+ return SQLITE_OK;
+ return SQLITE_IOERR_TRUNCATE;
+}
+
+int chromiumSync(sqlite3_file* sqliteFile, int flags)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xSync(chromiumFile->wrappedFile, flags);
+}
+
+int chromiumFileSize(sqlite3_file* sqliteFile, sqlite3_int64* pSize)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xFileSize(chromiumFile->wrappedFile, pSize);
+}
+
+int chromiumLock(sqlite3_file* sqliteFile, int eFileLock)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xLock(chromiumFile->wrappedFile, eFileLock);
+}
+
+int chromiumUnlock(sqlite3_file* sqliteFile, int eFileLock)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xUnlock(chromiumFile->wrappedFile, eFileLock);
+}
+
+int chromiumCheckReservedLock(sqlite3_file* sqliteFile, int* pResOut)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xCheckReservedLock(chromiumFile->wrappedFile, pResOut);
+}
+
+int chromiumFileControl(sqlite3_file* sqliteFile, int op, void* pArg)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xFileControl(chromiumFile->wrappedFile, op, pArg);
+}
+
+int chromiumSectorSize(sqlite3_file* sqliteFile)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xSectorSize(chromiumFile->wrappedFile);
+}
+
+int chromiumDeviceCharacteristics(sqlite3_file* sqliteFile)
+{
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile);
+ return chromiumFile->wrappedFile->pMethods->xDeviceCharacteristics(chromiumFile->wrappedFile);
+}
+
// Opens a file.
//
// vfs - pointer to the sqlite3_vfs object.
@@ -59,7 +146,7 @@ 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)
{
chromium_sqlite3_initialize_unix_sqlite3_file(id);
int fd = -1;
@@ -95,6 +182,53 @@ int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int d
return result;
}
+int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int desiredFlags, int* usedFlags)
+{
+ sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
+ sqlite3_file* wrappedFile = static_cast<sqlite3_file*>(sqlite3_malloc(wrappedVfs->szOsFile));
+ if (!wrappedFile)
+ 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* wrappedFileName = sqlite3_mprintf("%s", fileName);
+ if (!wrappedFileName) {
+ sqlite3_free(wrappedFile);
+ 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, wrappedFile, desiredFlags, usedFlags);
+ if (rc != SQLITE_OK) {
+ sqlite3_free(wrappedFileName);
+ sqlite3_free(wrappedFile);
+ 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.
+ };
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(id);
+ chromiumFile->pMethods = &chromiumIoMethods;
+ chromiumFile->wrappedFile = wrappedFile;
+ chromiumFile->wrappedFileName = wrappedFileName;
+ return SQLITE_OK;
+}
+
// Deletes the given file.
//
// vfs - pointer to the sqlite3_vfs object.
@@ -161,7 +295,7 @@ void chromiumDlError(sqlite3_vfs*, int bufSize, char* errorBuffer)
sqlite3_snprintf(bufSize, errorBuffer, "Dynamic loading not supported");
}
-void(*chromiumDlSym(sqlite3_vfs*, void *, const char*))(void)
+void(*chromiumDlSym(sqlite3_vfs*, void*, const char*))(void)
{
return 0;
}
@@ -170,25 +304,25 @@ void chromiumDlClose(sqlite3_vfs*, void*)
{
}
-int chromiumRandomness(sqlite3_vfs *vfs, int bufSize, char *buffer)
+int chromiumRandomness(sqlite3_vfs* vfs, int bufSize, char* buffer)
{
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
return wrappedVfs->xRandomness(wrappedVfs, bufSize, buffer);
}
-int chromiumSleep(sqlite3_vfs *vfs, int microseconds)
+int chromiumSleep(sqlite3_vfs* vfs, int microseconds)
{
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
return wrappedVfs->xSleep(wrappedVfs, microseconds);
}
-int chromiumCurrentTime(sqlite3_vfs *vfs, double *prNow)
+int chromiumCurrentTime(sqlite3_vfs* vfs, double* prNow)
{
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
return wrappedVfs->xCurrentTime(wrappedVfs, prNow);
}
-int chromiumGetLastError(sqlite3_vfs *vfs, int e, char* s)
+int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s)
{
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData);
return wrappedVfs->xGetLastError(wrappedVfs, e, s);
@@ -201,7 +335,7 @@ void SQLiteFileSystem::registerSQLiteVFS()
sqlite3_vfs* wrappedVfs = sqlite3_vfs_find("unix");
static sqlite3_vfs chromium_vfs = {
1,
- wrappedVfs->szOsFile,
+ sizeof(chromiumVfsFile),
wrappedVfs->mxPathname,
0,
"chromium_vfs",
« no previous file with comments | « LayoutTests/platform/mac/storage/websql/test-authorizer-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698