Index: net/disk_cache/simple/simple_synchronous_entry.cc |
diff --git a/net/disk_cache/simple/simple_synchronous_entry.cc b/net/disk_cache/simple/simple_synchronous_entry.cc |
index 864c05ac8ac7263cb69726376b0c4827f8b96004..502c9d67a100bb8522d17893075a7da81480c914 100644 |
--- a/net/disk_cache/simple/simple_synchronous_entry.cc |
+++ b/net/disk_cache/simple/simple_synchronous_entry.cc |
@@ -9,6 +9,7 @@ |
#include <functional> |
#include <limits> |
+#include "base/command_line.h" |
#include "base/compiler_specific.h" |
#include "base/files/file_util.h" |
#include "base/hash.h" |
@@ -39,7 +40,7 @@ enum OpenEntryResult { |
OPEN_ENTRY_BAD_MAGIC_NUMBER = 3, |
OPEN_ENTRY_BAD_VERSION = 4, |
OPEN_ENTRY_CANT_READ_KEY = 5, |
- // OPEN_ENTRY_KEY_MISMATCH = 6, Deprecated. |
+ OPEN_ENTRY_KEY_MISMATCH = 6, |
OPEN_ENTRY_KEY_HASH_MISMATCH = 7, |
OPEN_ENTRY_SPARSE_OPEN_FAILED = 8, |
OPEN_ENTRY_MAX = 9, |
@@ -130,8 +131,9 @@ namespace disk_cache { |
using simple_util::GetEntryHashKey; |
using simple_util::GetFilenameFromEntryHashAndFileIndex; |
using simple_util::GetSparseFilenameFromEntryHash; |
-using simple_util::GetDataSizeFromKeyAndFileSize; |
-using simple_util::GetFileSizeFromKeyAndDataSize; |
+using simple_util::GetHeaderSize; |
+using simple_util::GetDataSizeFromFileSize; |
+using simple_util::GetFileSizeFromDataSize; |
using simple_util::GetFileIndexFromStreamIndex; |
SimpleEntryStat::SimpleEntryStat(base::Time last_used, |
@@ -144,35 +146,34 @@ SimpleEntryStat::SimpleEntryStat(base::Time last_used, |
memcpy(data_size_, data_size, sizeof(data_size_)); |
} |
-int SimpleEntryStat::GetOffsetInFile(const std::string& key, |
+int SimpleEntryStat::GetOffsetInFile(size_t key_length, |
int offset, |
int stream_index) const { |
- const size_t headers_size = sizeof(SimpleFileHeader) + key.size(); |
+ const size_t headers_size = sizeof(SimpleFileHeader) + key_length; |
const size_t additional_offset = |
stream_index == 0 ? data_size_[1] + sizeof(SimpleFileEOF) : 0; |
return headers_size + offset + additional_offset; |
} |
-int SimpleEntryStat::GetEOFOffsetInFile(const std::string& key, |
+int SimpleEntryStat::GetEOFOffsetInFile(size_t key_length, |
int stream_index) const { |
- return GetOffsetInFile(key, data_size_[stream_index], stream_index); |
+ return GetOffsetInFile(key_length, data_size_[stream_index], stream_index); |
} |
-int SimpleEntryStat::GetLastEOFOffsetInFile(const std::string& key, |
+int SimpleEntryStat::GetLastEOFOffsetInFile(size_t key_length, |
int stream_index) const { |
const int file_index = GetFileIndexFromStreamIndex(stream_index); |
const int eof_data_offset = |
file_index == 0 ? data_size_[0] + data_size_[1] + sizeof(SimpleFileEOF) |
: data_size_[2]; |
- return GetOffsetInFile(key, eof_data_offset, stream_index); |
+ return GetOffsetInFile(key_length, eof_data_offset, stream_index); |
} |
-int64_t SimpleEntryStat::GetFileSize(const std::string& key, |
- int file_index) const { |
+int64_t SimpleEntryStat::GetFileSize(size_t key_length, int file_index) const { |
const int32_t total_data_size = |
file_index == 0 ? data_size_[0] + data_size_[1] + sizeof(SimpleFileEOF) |
: data_size_[2]; |
- return GetFileSizeFromKeyAndDataSize(key, total_data_size); |
+ return GetFileSizeFromDataSize(key_length, total_data_size); |
} |
SimpleEntryCreationResults::SimpleEntryCreationResults( |
@@ -223,17 +224,16 @@ SimpleSynchronousEntry::EntryOperationData::EntryOperationData( |
void SimpleSynchronousEntry::OpenEntry( |
net::CacheType cache_type, |
const FilePath& path, |
+ const std::string& key, |
const uint64_t entry_hash, |
- bool had_index, |
+ const bool had_index, |
SimpleEntryCreationResults* out_results) { |
base::ElapsedTimer open_time; |
SimpleSynchronousEntry* sync_entry = |
- new SimpleSynchronousEntry(cache_type, path, "", entry_hash); |
- out_results->result = |
- sync_entry->InitializeForOpen(had_index, |
- &out_results->entry_stat, |
- &out_results->stream_0_data, |
- &out_results->stream_0_crc32); |
+ new SimpleSynchronousEntry(cache_type, path, key, entry_hash, had_index); |
+ out_results->result = sync_entry->InitializeForOpen( |
+ &out_results->entry_stat, &out_results->stream_0_data, |
+ &out_results->stream_0_crc32); |
if (out_results->result != net::OK) { |
sync_entry->Doom(); |
delete sync_entry; |
@@ -251,13 +251,13 @@ void SimpleSynchronousEntry::CreateEntry( |
const FilePath& path, |
const std::string& key, |
const uint64_t entry_hash, |
- bool had_index, |
+ const bool had_index, |
SimpleEntryCreationResults* out_results) { |
DCHECK_EQ(entry_hash, GetEntryHashKey(key)); |
SimpleSynchronousEntry* sync_entry = |
- new SimpleSynchronousEntry(cache_type, path, key, entry_hash); |
- out_results->result = sync_entry->InitializeForCreate( |
- had_index, &out_results->entry_stat); |
+ new SimpleSynchronousEntry(cache_type, path, key, entry_hash, had_index); |
+ out_results->result = |
+ sync_entry->InitializeForCreate(&out_results->entry_stat); |
if (out_results->result != net::OK) { |
if (out_results->result != net::ERR_FILE_EXISTS) |
sync_entry->Doom(); |
@@ -298,19 +298,23 @@ void SimpleSynchronousEntry::ReadData(const EntryOperationData& in_entry_op, |
net::IOBuffer* out_buf, |
uint32_t* out_crc32, |
SimpleEntryStat* entry_stat, |
- int* out_result) const { |
+ int* out_result) { |
DCHECK(initialized_); |
DCHECK_NE(0, in_entry_op.index); |
- const int64_t file_offset = |
- entry_stat->GetOffsetInFile(key_, in_entry_op.offset, in_entry_op.index); |
int file_index = GetFileIndexFromStreamIndex(in_entry_op.index); |
+ if (header_and_key_check_needed_ && !CheckHeaderAndKeyForOpen(file_index)) { |
+ *out_result = net::ERR_FAILED; |
+ Doom(); |
+ return; |
+ } |
+ const int64_t file_offset = entry_stat->GetOffsetInFile( |
+ key_.size(), in_entry_op.offset, in_entry_op.index); |
// Zero-length reads and reads to the empty streams of omitted files should |
// be handled in the SimpleEntryImpl. |
DCHECK_GT(in_entry_op.buf_len, 0); |
DCHECK(!empty_file_omitted_[file_index]); |
- File* file = const_cast<File*>(&files_[file_index]); |
- int bytes_read = |
- file->Read(file_offset, out_buf->data(), in_entry_op.buf_len); |
+ int bytes_read = files_[file_index].Read(file_offset, out_buf->data(), |
+ in_entry_op.buf_len); |
if (bytes_read > 0) { |
entry_stat->set_last_used(Time::Now()); |
*out_crc32 = crc32(crc32(0L, Z_NULL, 0), |
@@ -333,12 +337,17 @@ void SimpleSynchronousEntry::WriteData(const EntryOperationData& in_entry_op, |
DCHECK_NE(0, in_entry_op.index); |
int index = in_entry_op.index; |
int file_index = GetFileIndexFromStreamIndex(index); |
+ if (header_and_key_check_needed_ && !CheckHeaderAndKeyForOpen(file_index)) { |
+ *out_result = net::ERR_FAILED; |
+ Doom(); |
+ return; |
+ } |
int offset = in_entry_op.offset; |
int buf_len = in_entry_op.buf_len; |
bool truncate = in_entry_op.truncate; |
bool doomed = in_entry_op.doomed; |
const int64_t file_offset = out_entry_stat->GetOffsetInFile( |
- key_, in_entry_op.offset, in_entry_op.index); |
+ key_.size(), in_entry_op.offset, in_entry_op.index); |
bool extending_by_write = offset + buf_len > out_entry_stat->data_size(index); |
if (empty_file_omitted_[file_index]) { |
@@ -371,7 +380,7 @@ void SimpleSynchronousEntry::WriteData(const EntryOperationData& in_entry_op, |
if (extending_by_write) { |
// The EOF record and the eventual stream afterward need to be zeroed out. |
const int64_t file_eof_offset = |
- out_entry_stat->GetEOFOffsetInFile(key_, index); |
+ out_entry_stat->GetEOFOffsetInFile(key_.size(), index); |
if (!files_[file_index].SetLength(file_eof_offset)) { |
RecordWriteResult(cache_type_, WRITE_RESULT_PRETRUNCATE_FAILURE); |
Doom(); |
@@ -393,7 +402,8 @@ void SimpleSynchronousEntry::WriteData(const EntryOperationData& in_entry_op, |
index, std::max(out_entry_stat->data_size(index), offset + buf_len)); |
} else { |
out_entry_stat->set_data_size(index, offset + buf_len); |
- int file_eof_offset = out_entry_stat->GetLastEOFOffsetInFile(key_, index); |
+ int file_eof_offset = |
+ out_entry_stat->GetLastEOFOffsetInFile(key_.size(), index); |
if (!files_[file_index].SetLength(file_eof_offset)) { |
RecordWriteResult(cache_type_, WRITE_RESULT_TRUNCATE_FAILURE); |
Doom(); |
@@ -644,7 +654,7 @@ void SimpleSynchronousEntry::Close( |
net::GrowableIOBuffer* stream_0_data) { |
DCHECK(stream_0_data); |
// Write stream 0 data. |
- int stream_0_offset = entry_stat.GetOffsetInFile(key_, 0, 0); |
+ int stream_0_offset = entry_stat.GetOffsetInFile(key_.size(), 0, 0); |
if (files_[0].Write(stream_0_offset, stream_0_data->data(), |
entry_stat.data_size(0)) != |
entry_stat.data_size(0)) { |
@@ -667,7 +677,7 @@ void SimpleSynchronousEntry::Close( |
if (it->has_crc32) |
eof_record.flags |= SimpleFileEOF::FLAG_HAS_CRC32; |
eof_record.data_crc32 = it->data_crc32; |
- int eof_offset = entry_stat.GetEOFOffsetInFile(key_, stream_index); |
+ int eof_offset = entry_stat.GetEOFOffsetInFile(key_.size(), stream_index); |
// If stream 0 changed size, the file needs to be resized, otherwise the |
// next open will yield wrong stream sizes. On stream 1 and stream 2 proper |
// resizing of the file is handled in SimpleSynchronousEntry::WriteData(). |
@@ -693,7 +703,7 @@ void SimpleSynchronousEntry::Close( |
continue; |
files_[i].Close(); |
- const int64_t file_size = entry_stat.GetFileSize(key_, i); |
+ const int64_t file_size = entry_stat.GetFileSize(key_.size(), i); |
SIMPLE_CACHE_UMA(CUSTOM_COUNTS, |
"LastClusterSize", cache_type_, |
file_size % 4096, 0, 4097, 50); |
@@ -720,13 +730,16 @@ void SimpleSynchronousEntry::Close( |
SimpleSynchronousEntry::SimpleSynchronousEntry(net::CacheType cache_type, |
const FilePath& path, |
const std::string& key, |
- const uint64_t entry_hash) |
+ const uint64_t entry_hash, |
+ const bool had_index) |
: cache_type_(cache_type), |
path_(path), |
entry_hash_(entry_hash), |
+ had_index_(had_index), |
key_(key), |
have_open_files_(false), |
- initialized_(false) { |
+ initialized_(false), |
+ header_and_key_check_needed_(false) { |
for (int i = 0; i < kSimpleEntryFileCount; ++i) |
empty_file_omitted_[i] = false; |
} |
@@ -779,21 +792,19 @@ bool SimpleSynchronousEntry::MaybeCreateFile( |
return files_[file_index].IsValid(); |
} |
-bool SimpleSynchronousEntry::OpenFiles( |
- bool had_index, |
- SimpleEntryStat* out_entry_stat) { |
+bool SimpleSynchronousEntry::OpenFiles(SimpleEntryStat* out_entry_stat) { |
for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
File::Error error; |
if (!MaybeOpenFile(i, &error)) { |
// TODO(juliatuttle,gavinp): Remove one each of these triplets of |
// histograms. We can calculate the third as the sum or difference of the |
// other two. |
- RecordSyncOpenResult( |
- cache_type_, OPEN_ENTRY_PLATFORM_FILE_ERROR, had_index); |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_PLATFORM_FILE_ERROR, |
+ had_index_); |
SIMPLE_CACHE_UMA(ENUMERATION, |
"SyncOpenPlatformFileError", cache_type_, |
-error, -base::File::FILE_ERROR_MAX); |
- if (had_index) { |
+ if (had_index_) { |
SIMPLE_CACHE_UMA(ENUMERATION, |
"SyncOpenPlatformFileError_WithIndex", cache_type_, |
-error, -base::File::FILE_ERROR_MAX); |
@@ -860,20 +871,18 @@ bool SimpleSynchronousEntry::OpenFiles( |
return true; |
} |
-bool SimpleSynchronousEntry::CreateFiles( |
- bool had_index, |
- SimpleEntryStat* out_entry_stat) { |
+bool SimpleSynchronousEntry::CreateFiles(SimpleEntryStat* out_entry_stat) { |
for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
File::Error error; |
if (!MaybeCreateFile(i, FILE_NOT_REQUIRED, &error)) { |
// TODO(juliatuttle,gavinp): Remove one each of these triplets of |
// histograms. We can calculate the third as the sum or difference of the |
// other two. |
- RecordSyncCreateResult(CREATE_ENTRY_PLATFORM_FILE_ERROR, had_index); |
+ RecordSyncCreateResult(CREATE_ENTRY_PLATFORM_FILE_ERROR, had_index_); |
SIMPLE_CACHE_UMA(ENUMERATION, |
"SyncCreatePlatformFileError", cache_type_, |
-error, -base::File::FILE_ERROR_MAX); |
- if (had_index) { |
+ if (had_index_) { |
SIMPLE_CACHE_UMA(ENUMERATION, |
"SyncCreatePlatformFileError_WithIndex", cache_type_, |
-error, -base::File::FILE_ERROR_MAX); |
@@ -919,13 +928,87 @@ void SimpleSynchronousEntry::CloseFiles() { |
CloseFile(i); |
} |
+bool SimpleSynchronousEntry::CheckHeaderAndKeyForOpen(int file_index) { |
+ // TODO(gavinp): Frequently we are doing this at the same time as we read from |
+ // the beginning of an entry. It might improve performance to make a single |
+ // read(2) call rather than two separate reads. On the other hand, it would |
+ // mean an extra memory to memory copy. In the case where we are opening an |
+ // entry without a key, the kInitialHeaderRead setting means that we are |
+ // actually already reading stream 1 data here, and tossing it out. |
+ std::vector<char> header_data(key_.empty() ? kInitialHeaderRead |
+ : GetHeaderSize(key_.size())); |
+ int bytes_read = |
+ files_[file_index].Read(0, header_data.data(), header_data.size()); |
+ const SimpleFileHeader* header = |
+ reinterpret_cast<const SimpleFileHeader*>(header_data.data()); |
+ |
+ if (bytes_read == -1 || static_cast<size_t>(bytes_read) < sizeof(*header)) { |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_CANT_READ_HEADER, had_index_); |
+ return false; |
+ } |
+ // This resize will not invalidate iterators since it does not enlarge the |
+ // header_data. |
+ DCHECK_LE(static_cast<size_t>(bytes_read), header_data.size()); |
+ header_data.resize(bytes_read); |
+ |
+ if (header->initial_magic_number != kSimpleInitialMagicNumber) { |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_BAD_MAGIC_NUMBER, had_index_); |
+ return false; |
+ } |
+ |
+ if (header->version != kSimpleEntryVersionOnDisk) { |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_BAD_VERSION, had_index_); |
+ return false; |
+ } |
+ |
+ size_t expected_header_size = GetHeaderSize(header->key_length); |
+ if (header_data.size() < expected_header_size) { |
+ size_t old_size = header_data.size(); |
+ // This resize will invalidate iterators, since it is enlarging header_data. |
+ header_data.resize(expected_header_size); |
+ int bytes_read = |
+ files_[file_index].Read(old_size, header_data.data() + old_size, |
+ expected_header_size - old_size); |
+ // If there was an IO error, just shrink the vector to its original size. |
+ // The buffer doesn't hold the entire key, so it will exit with a failure |
+ // and record the reason as OPEN_ENTRY_CANT_READ_KEY. |
+ if (bytes_read == -1) |
+ header_data.resize(old_size); |
+ else |
+ header_data.resize(old_size + bytes_read); |
+ header = reinterpret_cast<const SimpleFileHeader*>(header_data.data()); |
+ } |
+ |
+ if (header_data.size() < sizeof(*header) + header->key_length) { |
Randy Smith (Not in Mondays)
2016/05/18 16:41:30
Why do it by hand here and use GetHeaderSize() abo
Randy Smith (Not in Mondays)
2016/05/18 16:41:30
Suggestion: If I'm reading the code correctly, thi
gavinp
2016/05/18 19:05:03
Good catch. Done.
|
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_CANT_READ_KEY, had_index_); |
+ return false; |
+ } |
+ char* key_data = header_data.data() + sizeof(*header); |
+ if (base::Hash(key_data, header->key_length) != header->key_hash) { |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_KEY_HASH_MISMATCH, had_index_); |
+ return false; |
+ } |
+ |
+ std::string key_from_header(key_data, header->key_length); |
+ if (key_.empty()) { |
+ key_.swap(key_from_header); |
+ } else { |
+ if (key_ != key_from_header) { |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_KEY_MISMATCH, had_index_); |
+ return false; |
+ } |
+ } |
+ |
+ header_and_key_check_needed_ = false; |
+ return true; |
+} |
+ |
int SimpleSynchronousEntry::InitializeForOpen( |
- bool had_index, |
SimpleEntryStat* out_entry_stat, |
scoped_refptr<net::GrowableIOBuffer>* stream_0_data, |
uint32_t* out_stream_0_crc32) { |
DCHECK(!initialized_); |
- if (!OpenFiles(had_index, out_entry_stat)) { |
+ if (!OpenFiles(out_entry_stat)) { |
DLOG(WARNING) << "Could not open platform files for entry."; |
return net::ERR_FAILED; |
} |
@@ -933,69 +1016,38 @@ int SimpleSynchronousEntry::InitializeForOpen( |
if (empty_file_omitted_[i]) |
continue; |
- SimpleFileHeader header; |
- int header_read_result = |
- files_[i].Read(0, reinterpret_cast<char*>(&header), sizeof(header)); |
- if (header_read_result != sizeof(header)) { |
- DLOG(WARNING) << "Cannot read header from entry."; |
- RecordSyncOpenResult(cache_type_, OPEN_ENTRY_CANT_READ_HEADER, had_index); |
- return net::ERR_FAILED; |
- } |
- |
- if (header.initial_magic_number != kSimpleInitialMagicNumber) { |
- // TODO(gavinp): This seems very bad; for now we log at WARNING, but we |
- // should give consideration to not saturating the log with these if that |
- // becomes a problem. |
- DLOG(WARNING) << "Magic number did not match."; |
- RecordSyncOpenResult(cache_type_, OPEN_ENTRY_BAD_MAGIC_NUMBER, had_index); |
- return net::ERR_FAILED; |
- } |
- |
- if (header.version != kSimpleEntryVersionOnDisk) { |
- DLOG(WARNING) << "Unreadable version."; |
- RecordSyncOpenResult(cache_type_, OPEN_ENTRY_BAD_VERSION, had_index); |
- return net::ERR_FAILED; |
- } |
- |
- std::unique_ptr<char[]> key(new char[header.key_length]); |
- int key_read_result = files_[i].Read(sizeof(header), key.get(), |
- header.key_length); |
- if (key_read_result != base::checked_cast<int>(header.key_length)) { |
- DLOG(WARNING) << "Cannot read key from entry."; |
- RecordSyncOpenResult(cache_type_, OPEN_ENTRY_CANT_READ_KEY, had_index); |
- return net::ERR_FAILED; |
+ if (!key_.empty() && |
+ base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ "simple-cache-dont-read-initial-header")) { |
+ header_and_key_check_needed_ = true; |
+ } else { |
+ if (!CheckHeaderAndKeyForOpen(i)) |
+ return net::ERR_FAILED; |
} |
- key_ = std::string(key.get(), header.key_length); |
if (i == 0) { |
// File size for stream 0 has been stored temporarily in data_size[1]. |
int total_data_size = |
- GetDataSizeFromKeyAndFileSize(key_, out_entry_stat->data_size(1)); |
+ GetDataSizeFromFileSize(key_.size(), out_entry_stat->data_size(1)); |
int ret_value_stream_0 = ReadAndValidateStream0( |
total_data_size, out_entry_stat, stream_0_data, out_stream_0_crc32); |
if (ret_value_stream_0 != net::OK) |
return ret_value_stream_0; |
} else { |
out_entry_stat->set_data_size( |
- 2, GetDataSizeFromKeyAndFileSize(key_, out_entry_stat->data_size(2))); |
+ 2, |
+ GetDataSizeFromFileSize(key_.size(), out_entry_stat->data_size(2))); |
if (out_entry_stat->data_size(2) < 0) { |
DLOG(WARNING) << "Stream 2 file is too small."; |
return net::ERR_FAILED; |
} |
} |
- |
- if (base::Hash(key.get(), header.key_length) != header.key_hash) { |
- DLOG(WARNING) << "Hash mismatch on key."; |
- RecordSyncOpenResult( |
- cache_type_, OPEN_ENTRY_KEY_HASH_MISMATCH, had_index); |
- return net::ERR_FAILED; |
- } |
} |
int32_t sparse_data_size = 0; |
if (!OpenSparseFileIfExists(&sparse_data_size)) { |
- RecordSyncOpenResult( |
- cache_type_, OPEN_ENTRY_SPARSE_OPEN_FAILED, had_index); |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_SPARSE_OPEN_FAILED, |
+ had_index_); |
return net::ERR_FAILED; |
} |
out_entry_stat->set_sparse_data_size(sparse_data_size); |
@@ -1015,7 +1067,7 @@ int SimpleSynchronousEntry::InitializeForOpen( |
SIMPLE_CACHE_UMA(BOOLEAN, "EntryOpenedAndStream2Removed", cache_type_, |
removed_stream2); |
- RecordSyncOpenResult(cache_type_, OPEN_ENTRY_SUCCESS, had_index); |
+ RecordSyncOpenResult(cache_type_, OPEN_ENTRY_SUCCESS, had_index_); |
initialized_ = true; |
return net::OK; |
} |
@@ -1048,10 +1100,9 @@ bool SimpleSynchronousEntry::InitializeCreatedFile( |
} |
int SimpleSynchronousEntry::InitializeForCreate( |
- bool had_index, |
SimpleEntryStat* out_entry_stat) { |
DCHECK(!initialized_); |
- if (!CreateFiles(had_index, out_entry_stat)) { |
+ if (!CreateFiles(out_entry_stat)) { |
DLOG(WARNING) << "Could not create platform files."; |
return net::ERR_FILE_EXISTS; |
} |
@@ -1061,11 +1112,11 @@ int SimpleSynchronousEntry::InitializeForCreate( |
CreateEntryResult result; |
if (!InitializeCreatedFile(i, &result)) { |
- RecordSyncCreateResult(result, had_index); |
+ RecordSyncCreateResult(result, had_index_); |
return net::ERR_FAILED; |
} |
} |
- RecordSyncCreateResult(CREATE_ENTRY_SUCCESS, had_index); |
+ RecordSyncCreateResult(CREATE_ENTRY_SUCCESS, had_index_); |
initialized_ = true; |
return net::OK; |
} |
@@ -1099,7 +1150,7 @@ int SimpleSynchronousEntry::ReadAndValidateStream0( |
// Put stream 0 data in memory. |
*stream_0_data = new net::GrowableIOBuffer(); |
(*stream_0_data)->SetCapacity(stream_0_size); |
- int file_offset = out_entry_stat->GetOffsetInFile(key_, 0, 0); |
+ int file_offset = out_entry_stat->GetOffsetInFile(key_.size(), 0, 0); |
File* file = const_cast<File*>(&files_[0]); |
int bytes_read = |
file->Read(file_offset, (*stream_0_data)->data(), stream_0_size); |
@@ -1129,7 +1180,7 @@ int SimpleSynchronousEntry::GetEOFRecordData(int index, |
uint32_t* out_crc32, |
int* out_data_size) const { |
SimpleFileEOF eof_record; |
- int file_offset = entry_stat.GetEOFOffsetInFile(key_, index); |
+ int file_offset = entry_stat.GetEOFOffsetInFile(key_.size(), index); |
int file_index = GetFileIndexFromStreamIndex(index); |
File* file = const_cast<File*>(&files_[file_index]); |
if (file->Read(file_offset, reinterpret_cast<char*>(&eof_record), |