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

Side by Side 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, const char* fi leName, int flags, int* fd); 45 int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, const char* fi leName, int flags, int* fd);
46 void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, int fd, in t flags); 46 void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, int fd, in t flags);
47 void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file); 47 void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file);
48 } 48 }
49 49
50 namespace blink { 50 namespace blink {
51 51
52 // Chromium's Posix implementation of SQLite VFS 52 // Chromium's Posix implementation of SQLite VFS
53 namespace { 53 namespace {
54 54
55 struct chromiumVfsFile {
56 sqlite3_io_methods* pMethods;
57 sqlite3_file* realFile;
58 char* fileName;
59 };
60
61 int chromiumClose(sqlite3_file* fi)
62 {
63 chromiumVfsFile* f = (chromiumVfsFile*)fi;
64 int r = f->realFile->pMethods->xClose(f->realFile);
65 sqlite3_free(f->fileName);
66 sqlite3_free(f->realFile);
67 memset(f, 0, sizeof(*f));
68 return r;
69 }
70
71 int chromiumRead(sqlite3_file* fi, void* pBuf, int iAmt, sqlite3_int64 iOfst)
72 {
73 chromiumVfsFile* f = (chromiumVfsFile*)fi;
74 return f->realFile->pMethods->xRead(f->realFile, pBuf, iAmt, iOfst);
75 }
76
77 int chromiumWrite(sqlite3_file* fi, const void* pBuf, int iAmt, sqlite3_int64 iO fst)
78 {
79 chromiumVfsFile* f = (chromiumVfsFile*)fi;
80 return f->realFile->pMethods->xWrite(f->realFile, pBuf, iAmt, iOfst);
81 }
82
83 int chromiumTruncate(sqlite3_file* fi, sqlite3_int64 size)
84 {
85 chromiumVfsFile* f = (chromiumVfsFile*)fi;
86
87 // The OSX and Linux sandboxes block ftruncate(), proxy to the browser
88 // process.
89 if (Platform::current()->databaseSetFileSize(String(f->fileName), size))
90 return SQLITE_OK;
91 return SQLITE_IOERR_TRUNCATE;
92 }
93
94 int chromiumSync(sqlite3_file* fi, int flags)
95 {
96 chromiumVfsFile* f = (chromiumVfsFile*)fi;
97 return f->realFile->pMethods->xSync(f->realFile, flags);
98 }
99
100 int chromiumFileSize(sqlite3_file* fi, sqlite3_int64 *pSize)
101 {
102 chromiumVfsFile* f = (chromiumVfsFile*)fi;
103 return f->realFile->pMethods->xFileSize(f->realFile, pSize);
104 }
105
106 int chromiumLock(sqlite3_file* fi, int eFileLock)
107 {
108 chromiumVfsFile* f = (chromiumVfsFile*)fi;
109 return f->realFile->pMethods->xLock(f->realFile, eFileLock);
110 }
111
112 int chromiumUnlock(sqlite3_file* fi, int eFileLock)
113 {
114 chromiumVfsFile* f = (chromiumVfsFile*)fi;
115 return f->realFile->pMethods->xUnlock(f->realFile, eFileLock);
116 }
117
118 int chromiumCheckReservedLock(sqlite3_file* fi, int *pResOut)
119 {
120 chromiumVfsFile* f = (chromiumVfsFile*)fi;
121 return f->realFile->pMethods->xCheckReservedLock(f->realFile, pResOut);
122 }
123
124 int chromiumFileControl(sqlite3_file* fi, int op, void *pArg)
125 {
126 chromiumVfsFile* f = (chromiumVfsFile*)fi;
127 return f->realFile->pMethods->xFileControl(f->realFile, op, pArg);
128 }
129
130 int chromiumSectorSize(sqlite3_file* fi)
131 {
132 chromiumVfsFile* f = (chromiumVfsFile*)fi;
133 return f->realFile->pMethods->xSectorSize(f->realFile);
134 }
135
136 int chromiumDeviceCharacteristics(sqlite3_file* fi)
137 {
138 chromiumVfsFile* f = (chromiumVfsFile*)fi;
139 return f->realFile->pMethods->xDeviceCharacteristics(f->realFile);
140 }
141
55 // Opens a file. 142 // Opens a file.
56 // 143 //
57 // vfs - pointer to the sqlite3_vfs object. 144 // vfs - pointer to the sqlite3_vfs object.
58 // fileName - the name of the file. 145 // fileName - the name of the file.
59 // id - the structure that will manipulate the newly opened file. 146 // id - the structure that will manipulate the newly opened file.
60 // desiredFlags - the desired open mode flags. 147 // desiredFlags - the desired open mode flags.
61 // usedFlags - the actual open mode flags that were used. 148 // usedFlags - the actual open mode flags that were used.
62 int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, 149 int chromiumOpenInternal(sqlite3_vfs* vfs, const char* fileName,
63 sqlite3_file* id, int desiredFlags, int* usedFlags) 150 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...
64 { 151 {
65 chromium_sqlite3_initialize_unix_sqlite3_file(id); 152 chromium_sqlite3_initialize_unix_sqlite3_file(id);
66 int fd = -1; 153 int fd = -1;
67 int result = chromium_sqlite3_get_reusable_file_handle(id, fileName, desired Flags, &fd); 154 int result = chromium_sqlite3_get_reusable_file_handle(id, fileName, desired Flags, &fd);
68 if (result != SQLITE_OK) 155 if (result != SQLITE_OK)
69 return result; 156 return result;
70 157
71 if (fd < 0) { 158 if (fd < 0) {
72 fd = Platform::current()->databaseOpenFile(String(fileName), desiredFlag s); 159 fd = Platform::current()->databaseOpenFile(String(fileName), desiredFlag s);
73 if ((fd < 0) && (desiredFlags & SQLITE_OPEN_READWRITE)) { 160 if ((fd < 0) && (desiredFlags & SQLITE_OPEN_READWRITE)) {
(...skipping 14 matching lines...) Expand all
88 175
89 // The mask 0x00007F00 gives us the 7 bits that determine the type of the fi le SQLite is trying to open. 176 // The mask 0x00007F00 gives us the 7 bits that determine the type of the fi le SQLite is trying to open.
90 int fileType = desiredFlags & 0x00007F00; 177 int fileType = desiredFlags & 0x00007F00;
91 int noLock = (fileType != SQLITE_OPEN_MAIN_DB); 178 int noLock = (fileType != SQLITE_OPEN_MAIN_DB);
92 result = chromium_sqlite3_fill_in_unix_sqlite3_file(vfs, fd, -1, id, fileNam e, noLock); 179 result = chromium_sqlite3_fill_in_unix_sqlite3_file(vfs, fd, -1, id, fileNam e, noLock);
93 if (result != SQLITE_OK) 180 if (result != SQLITE_OK)
94 chromium_sqlite3_destroy_reusable_file_handle(id); 181 chromium_sqlite3_destroy_reusable_file_handle(id);
95 return result; 182 return result;
96 } 183 }
97 184
185 // SQLite allocates a buffer using szOsFile then calls xOpen() on it. registerS QLiteVFS() caches the size of the "unix"
186 // vfs structure for use by chromiumOpen().
187 static size_t szUnixFile = 0;
188
189 int chromiumOpen(sqlite3_vfs* vfs, const char* fileName,
190 sqlite3_file* id, int desiredFlags, int* usedFlags)
Scott Hess - ex-Googler 2015/03/18 01:45:46 This indentation is throwing pre-submit complaints
191 {
192 // registerSQLiteVFS() never happened.
193 if (!szUnixFile)
194 return SQLITE_ERROR;
195
196 sqlite3_file* realFile = (sqlite3_file*)sqlite3_malloc(szUnixFile);
197 if (!realFile)
198 return SQLITE_NOMEM;
199
200 // Make a local copy of the file name. SQLite's os_unix.c appears to be wri tten to allow caching the pointer passed
201 // in to this function, but that seems brittle.
202 char* realFileName = sqlite3_mprintf("%s", fileName);
203 if (!realFileName) {
204 sqlite3_free(realFile);
205 return SQLITE_NOMEM;
206 }
207
208 // SQLite's unixOpen() makes assumptions about the structure of |fileName|. Our local copy may not answer those
209 // assumptions correctly.
210 int rc = chromiumOpenInternal(vfs, fileName, realFile, desiredFlags, usedFla gs);
211 if (rc != SQLITE_OK) {
212 sqlite3_free(realFileName);
213 sqlite3_free(realFile);
214 return rc;
215 }
216
217 static sqlite3_io_methods chromiumIoMethods = {
218 1,
219 chromiumClose,
220 chromiumRead,
221 chromiumWrite,
222 chromiumTruncate,
223 chromiumSync,
224 chromiumFileSize,
225 chromiumLock,
226 chromiumUnlock,
227 chromiumCheckReservedLock,
228 chromiumFileControl,
229 chromiumSectorSize,
230 chromiumDeviceCharacteristics,
231 // 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
232 };
233 chromiumVfsFile* f = (chromiumVfsFile*)id;
234 f->pMethods = &chromiumIoMethods;
235 f->realFile = realFile;
236 f->fileName = realFileName;
237 return SQLITE_OK;
238 }
239
98 // Deletes the given file. 240 // Deletes the given file.
99 // 241 //
100 // vfs - pointer to the sqlite3_vfs object. 242 // vfs - pointer to the sqlite3_vfs object.
101 // fileName - the name of the file. 243 // fileName - the name of the file.
102 // syncDir - determines if the directory to which this file belongs 244 // syncDir - determines if the directory to which this file belongs
103 // should be synched after the file is deleted. 245 // should be synched after the file is deleted.
104 int chromiumDelete(sqlite3_vfs*, const char* fileName, int syncDir) 246 int chromiumDelete(sqlite3_vfs*, const char* fileName, int syncDir)
105 { 247 {
106 return Platform::current()->databaseDeleteFile(String(fileName), syncDir); 248 return Platform::current()->databaseDeleteFile(String(fileName), syncDir);
107 } 249 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 } 304 }
163 #else 305 #else
164 #define chromiumDlOpen 0 306 #define chromiumDlOpen 0
165 #endif // SQLITE_OMIT_LOAD_EXTENSION 307 #endif // SQLITE_OMIT_LOAD_EXTENSION
166 308
167 } // namespace 309 } // namespace
168 310
169 void SQLiteFileSystem::registerSQLiteVFS() 311 void SQLiteFileSystem::registerSQLiteVFS()
170 { 312 {
171 sqlite3_vfs* unix_vfs = sqlite3_vfs_find("unix"); 313 sqlite3_vfs* unix_vfs = sqlite3_vfs_find("unix");
314 szUnixFile = unix_vfs->szOsFile;
172 static sqlite3_vfs chromium_vfs = { 315 static sqlite3_vfs chromium_vfs = {
173 1, 316 1,
174 unix_vfs->szOsFile, 317 sizeof(chromiumVfsFile),
175 unix_vfs->mxPathname, 318 unix_vfs->mxPathname,
176 0, 319 0,
177 "chromium_vfs", 320 "chromium_vfs",
178 unix_vfs->pAppData, 321 unix_vfs->pAppData,
michaeln 2015/03/19 00:14:04 this func ptr is supposed to be a FINDER function
Scott Hess - ex-Googler 2015/03/25 20:19:55 pAppData is just a place you can tuck random infor
179 chromiumOpen, 322 chromiumOpen,
180 chromiumDelete, 323 chromiumDelete,
181 chromiumAccess, 324 chromiumAccess,
182 chromiumFullPathname, 325 chromiumFullPathname,
183 chromiumDlOpen, 326 chromiumDlOpen,
184 unix_vfs->xDlError, 327 unix_vfs->xDlError,
185 unix_vfs->xDlSym, 328 unix_vfs->xDlSym,
186 unix_vfs->xDlClose, 329 unix_vfs->xDlClose,
187 unix_vfs->xRandomness, 330 unix_vfs->xRandomness,
188 unix_vfs->xSleep, 331 unix_vfs->xSleep,
189 unix_vfs->xCurrentTime, 332 unix_vfs->xCurrentTime,
190 unix_vfs->xGetLastError 333 unix_vfs->xGetLastError
191 }; 334 };
192 sqlite3_vfs_register(&chromium_vfs, 0); 335 sqlite3_vfs_register(&chromium_vfs, 0);
193 } 336 }
194 337
195 } // namespace blink 338 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698