Chromium Code Reviews| Index: webkit/fileapi/obfuscated_file_system_file_util.cc |
| diff --git a/webkit/fileapi/obfuscated_file_system_file_util.cc b/webkit/fileapi/obfuscated_file_system_file_util.cc |
| index abff6cb5845cc1796b351e12cf90c7df23f2c4b8..830b0ab6a7d802c5678cac9c0600b3240071fcf4 100644 |
| --- a/webkit/fileapi/obfuscated_file_system_file_util.cc |
| +++ b/webkit/fileapi/obfuscated_file_system_file_util.cc |
| @@ -79,7 +79,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen( |
| return base::PLATFORM_FILE_ERROR_FAILED; |
| FileId file_id; |
| if (!db->GetFileWithPath(virtual_path, &file_id)) { |
| - // The file doesn't exist. |
| + // The file doesn't exist in the database. |
| if (!(file_flags & (base::PLATFORM_FILE_CREATE | |
| base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) |
| return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| @@ -88,9 +88,20 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen( |
| return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| FileInfo file_info; |
| InitFileInfo(&file_info, parent_id, virtual_path.BaseName().value()); |
| + |
| + // There may be a file without database entry out of inconsistency between |
| + // actual filesystem and database. We use PLATFORM_FILE_CREATE_ALWAYS |
| + // to truncate such file. |
| + file_flags &= ~(base::PLATFORM_FILE_OPEN | |
| + base::PLATFORM_FILE_CREATE | |
| + base::PLATFORM_FILE_OPEN_TRUNCATED); |
| + file_flags |= base::PLATFORM_FILE_CREATE_ALWAYS | |
| + base::PLATFORM_FILE_OPEN_ALWAYS; |
|
ericu
2011/08/10 17:28:01
From platform_file.h:
// PLATFORM_FILE_(OPEN|CRE
tzik
2011/08/16 08:25:33
Yes, the patch went wrong way. It caused tests fai
|
| PlatformFileError error = CreateFile( |
| context, context->src_origin_url(), context->src_type(), FilePath(), |
| &file_info, file_flags, file_handle); |
| + if (error == base::PLATFORM_FILE_ERROR_EXISTS) |
| + error = base::PLATFORM_FILE_OK; |
| if (created && base::PLATFORM_FILE_OK == error) |
| *created = true; |
| return error; |
| @@ -795,6 +806,21 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
| DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. |
| error = underlying_file_util_->EnsureFileExists( |
| context, path, &created); |
| + |
| + // If the file already exists, we found a stray file out of |
| + // inconsistency between database and filesystem. We should truncate |
| + // it to empty. |
| + if (error == base::PLATFORM_FILE_OK && !created) { |
| + PlatformFile file = base::CreatePlatformFile( |
| + path, base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_CREATE_ALWAYS, |
| + &created, &error); |
| + if (error == base::PLATFORM_FILE_ERROR_EXISTS) |
| + error = base::PLATFORM_FILE_OK; |
| + if (error == base::PLATFORM_FILE_OK) { |
| + if (!base::ClosePlatformFile(file)) |
| + error = base::PLATFORM_FILE_ERROR_FAILED; |
| + } |
| + } |
| } |
| } |
| if (error != base::PLATFORM_FILE_OK) |
| @@ -1032,14 +1058,27 @@ FilePath ObfuscatedFileSystemFileUtil::GetDirectoryForOrigin( |
| return FilePath(); |
| FilePath directory_name; |
| std::string id = GetOriginIdentifierFromURL(origin); |
| - if (!create && !origin_database_->HasOriginPath(id)) |
| + |
| + bool exists_in_db = origin_database_->HasOriginPath(id); |
| + if (!exists_in_db && !create) |
| return FilePath(); |
| if (!origin_database_->GetPathForOrigin(id, &directory_name)) |
| return FilePath(); |
| + |
| FilePath path = file_system_directory_.Append(directory_name); |
| - if (!file_util::DirectoryExists(path) && |
| - (!create || !file_util::CreateDirectory(path))) |
| - return FilePath(); |
| + bool exists_in_fs = file_util::DirectoryExists(path); |
| + if (!exists_in_db && exists_in_fs) { |
| + if (!file_util::Delete(path, true)) |
| + return FilePath(); |
| + else |
| + exists_in_fs = false; |
| + } |
| + |
| + if (!exists_in_fs) { |
| + if (!create || !file_util::CreateDirectory(path)) |
| + return FilePath(); |
| + } |
| + |
| return path; |
| } |