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

Unified Diff: chrome/browser/renderer_host/database_dispatcher_host.cc

Issue 194021: Bug fix: produce unique temp file names when the VFS requests a handle to a n... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Final version. Created 11 years, 3 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 | « base/file_util_posix.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/renderer_host/database_dispatcher_host.cc
===================================================================
--- chrome/browser/renderer_host/database_dispatcher_host.cc (revision 25936)
+++ chrome/browser/renderer_host/database_dispatcher_host.cc (working copy)
@@ -64,8 +64,13 @@
// Make sure the flags used to open a DB file are consistent.
static bool OpenFileFlagsAreConsistent(const OpenFileParams& params) {
- if (params.file_name == params.db_dir) {
- return (params.desired_flags == SQLITE_OPEN_READONLY);
+ // Is this a request for a temp file?
+ // We should be able to delete temp files when they're closed
+ // and create them as needed
+ if ((params.file_name == params.db_dir) &&
+ (!(params.desired_flags & SQLITE_OPEN_DELETEONCLOSE) ||
+ !(params.desired_flags & SQLITE_OPEN_CREATE))) {
+ return false;
}
const int file_type = params.desired_flags & 0x00007F00;
@@ -166,9 +171,20 @@
base::PLATFORM_FILE_DELETE_ON_CLOSE;
}
+ // If this is a request for a handle to a temp file, get a unique file name
+ FilePath file_name;
+ if (params.file_name == params.db_dir) {
+ if (!file_util::CreateTemporaryFileInDir(params.db_dir, &file_name)) {
+ file_name = FilePath();
+ }
+ } else {
+ file_name = params.file_name;
+ }
+
// Try to open/create the DB file.
base::PlatformFile file_handle =
- base::CreatePlatformFile(params.file_name.ToWStringHack(), flags, NULL);
+ (file_name.empty() ? base::kInvalidPlatformFileValue :
+ base::CreatePlatformFile(file_name.ToWStringHack(), flags, NULL));
if (file_handle != base::kInvalidPlatformFileValue) {
#if defined(OS_WIN)
// Duplicate the file handle.
@@ -200,17 +216,17 @@
}
}
- ViewMsg_DatabaseOpenFileResponse_Params response_params =
+ ViewMsg_DatabaseOpenFileResponse_Params response_params;
#if defined(OS_WIN)
- { target_handle };
+ response_params.file_handle = target_handle;
#elif defined(OS_POSIX)
- { base::FileDescriptor(target_handle, true),
- base::FileDescriptor(target_dir_handle, true) };
+ response_params.file_handle = base::FileDescriptor(target_handle, true);
+ response_params.dir_handle = base::FileDescriptor(target_dir_handle, true);
#endif
io_thread_message_loop->PostTask(FROM_HERE,
- NewRunnableFunction(SendMessage, sender,
- new ViewMsg_DatabaseOpenFileResponse(message_id, response_params)));
+ NewRunnableFunction(SendMessage, sender,
+ new ViewMsg_DatabaseOpenFileResponse(message_id, response_params)));
}
// Scheduled by the IO thread on the file thread.
@@ -227,17 +243,17 @@
// after kNumDeleteRetries times.
if (!reschedule_count) {
io_thread_message_loop->PostTask(FROM_HERE,
- NewRunnableFunction(SendMessage, sender,
- new ViewMsg_DatabaseDeleteFileResponse(
- message_id, SQLITE_IOERR_DELETE)));
+ NewRunnableFunction(SendMessage, sender,
+ new ViewMsg_DatabaseDeleteFileResponse(
+ message_id, SQLITE_IOERR_DELETE)));
return;
}
// If the file does not exist, we're done.
if (!file_util::PathExists(params.file_name)) {
io_thread_message_loop->PostTask(FROM_HERE,
- NewRunnableFunction(SendMessage, sender,
- new ViewMsg_DatabaseDeleteFileResponse(message_id, SQLITE_OK)));
+ NewRunnableFunction(SendMessage, sender,
+ new ViewMsg_DatabaseDeleteFileResponse(message_id, SQLITE_OK)));
return;
}
@@ -245,8 +261,8 @@
// If the file could not be deleted, try again.
if (!file_util::Delete(params.file_name, false)) {
MessageLoop::current()->PostDelayedTask(FROM_HERE,
- NewRunnableFunction(DatabaseDeleteFile, io_thread_message_loop,
- params, message_id, reschedule_count - 1, sender),
+ NewRunnableFunction(DatabaseDeleteFile, io_thread_message_loop,
+ params, message_id, reschedule_count - 1, sender),
kDelayDeleteRetryMs);
return;
}
@@ -270,8 +286,8 @@
#endif
io_thread_message_loop->PostTask(FROM_HERE,
- NewRunnableFunction(SendMessage, sender,
- new ViewMsg_DatabaseDeleteFileResponse(message_id, error_code)));
+ NewRunnableFunction(SendMessage, sender,
+ new ViewMsg_DatabaseDeleteFileResponse(message_id, error_code)));
}
// Scheduled by the IO thread on the file thread.
@@ -299,8 +315,9 @@
#endif
io_thread_message_loop->PostTask(FROM_HERE,
- NewRunnableFunction(SendMessage, sender,
- new ViewMsg_DatabaseGetFileAttributesResponse(message_id, attributes)));
+ NewRunnableFunction(SendMessage, sender,
+ new ViewMsg_DatabaseGetFileAttributesResponse(
+ message_id, attributes)));
}
// Scheduled by the IO thread on the file thread.
@@ -318,8 +335,8 @@
}
io_thread_message_loop->PostTask(FROM_HERE,
- NewRunnableFunction(SendMessage, sender,
- new ViewMsg_DatabaseGetFileSizeResponse(message_id, size)));
+ NewRunnableFunction(SendMessage, sender,
+ new ViewMsg_DatabaseGetFileSizeResponse(message_id, size)));
}
} // namespace
@@ -388,15 +405,17 @@
FilePath db_file_name = GetDBFileFullPath(file_name);
if (db_file_name.empty()) {
- ViewMsg_DatabaseOpenFileResponse_Params response_params =
+ ViewMsg_DatabaseOpenFileResponse_Params response_params;
#if defined(OS_WIN)
- { base::kInvalidPlatformFileValue };
+ response_params.file_handle = base::kInvalidPlatformFileValue;
#elif defined(OS_POSIX)
- { base::FileDescriptor(base::kInvalidPlatformFileValue, true),
- base::FileDescriptor(base::kInvalidPlatformFileValue, true) };
+ response_params.file_handle =
+ base::FileDescriptor(base::kInvalidPlatformFileValue, true);
+ response_params.dir_handle =
+ base::FileDescriptor(base::kInvalidPlatformFileValue, true);
#endif
resource_message_filter_->Send(new ViewMsg_DatabaseOpenFileResponse(
- message_id, response_params));
+ message_id, response_params));
return;
}
@@ -404,8 +423,8 @@
resource_message_filter_->handle() };
resource_message_filter_->AddRef();
file_thread_message_loop_->PostTask(FROM_HERE,
- NewRunnableFunction(DatabaseOpenFile, MessageLoop::current(),
- params, message_id, resource_message_filter_));
+ NewRunnableFunction(DatabaseOpenFile, MessageLoop::current(),
+ params, message_id, resource_message_filter_));
}
void DatabaseDispatcherHost::OnDatabaseDeleteFile(
@@ -413,15 +432,15 @@
FilePath db_file_name = GetDBFileFullPath(file_name);
if (db_file_name.empty()) {
resource_message_filter_->Send(new ViewMsg_DatabaseDeleteFileResponse(
- message_id, SQLITE_IOERR_DELETE));
+ message_id, SQLITE_IOERR_DELETE));
return;
}
DeleteFileParams params = { GetDBDir(), db_file_name, sync_dir };
resource_message_filter_->AddRef();
file_thread_message_loop_->PostTask(FROM_HERE,
- NewRunnableFunction(DatabaseDeleteFile, MessageLoop::current(),
- params, message_id, kNumDeleteRetries, resource_message_filter_));
+ NewRunnableFunction(DatabaseDeleteFile, MessageLoop::current(),
+ params, message_id, kNumDeleteRetries, resource_message_filter_));
}
void DatabaseDispatcherHost::OnDatabaseGetFileAttributes(
@@ -429,15 +448,15 @@
FilePath db_file_name = GetDBFileFullPath(file_name);
if (db_file_name.empty()) {
resource_message_filter_->Send(
- new ViewMsg_DatabaseGetFileAttributesResponse(
- message_id, -1));
+ new ViewMsg_DatabaseGetFileAttributesResponse(
+ message_id, -1));
return;
}
resource_message_filter_->AddRef();
file_thread_message_loop_->PostTask(FROM_HERE,
- NewRunnableFunction(DatabaseGetFileAttributes, MessageLoop::current(),
- db_file_name, message_id, resource_message_filter_));
+ NewRunnableFunction(DatabaseGetFileAttributes, MessageLoop::current(),
+ db_file_name, message_id, resource_message_filter_));
}
void DatabaseDispatcherHost::OnDatabaseGetFileSize(
@@ -445,12 +464,12 @@
FilePath db_file_name = GetDBFileFullPath(file_name);
if (db_file_name.empty()) {
resource_message_filter_->Send(new ViewMsg_DatabaseGetFileSizeResponse(
- message_id, 0));
+ message_id, 0));
return;
}
resource_message_filter_->AddRef();
file_thread_message_loop_->PostTask(FROM_HERE,
- NewRunnableFunction(DatabaseGetFileSize, MessageLoop::current(),
- db_file_name, message_id, resource_message_filter_));
+ NewRunnableFunction(DatabaseGetFileSize, MessageLoop::current(),
+ db_file_name, message_id, resource_message_filter_));
}
« no previous file with comments | « base/file_util_posix.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698