diff options
-rw-r--r-- | net/base/net_error_list.h | 3 | ||||
-rw-r--r-- | net/disk_cache/block_files.cc | 6 | ||||
-rw-r--r-- | net/disk_cache/block_files.h | 1 | ||||
-rw-r--r-- | net/disk_cache/block_files_unittest.cc | 26 | ||||
-rw-r--r-- | net/disk_cache/file_posix.cc | 5 | ||||
-rw-r--r-- | net/disk_cache/file_win.cc | 3 |
6 files changed, 39 insertions, 5 deletions
diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h index 1147267..01c1678 100644 --- a/net/base/net_error_list.h +++ b/net/base/net_error_list.h @@ -450,7 +450,8 @@ NET_ERROR(CACHE_MISS, -400) // Unable to read from the disk cache. NET_ERROR(CACHE_READ_FAILURE, -401) -// ****NOTE THAT code -402 is available**** +// Unable to write to the disk cache. +NET_ERROR(CACHE_WRITE_FAILURE, -402) // The operation is not supported for this entry. NET_ERROR(CACHE_OPERATION_NOT_SUPPORTED, -403) diff --git a/net/disk_cache/block_files.cc b/net/disk_cache/block_files.cc index faa9706..e39ca13 100644 --- a/net/disk_cache/block_files.cc +++ b/net/disk_cache/block_files.cc @@ -419,6 +419,12 @@ bool BlockFiles::OpenBlockFile(int index) { return false; } + if (static_cast<int>(file_len) < + header->max_entries * header->entry_size + kBlockHeaderSize) { + LOG(ERROR) << "File too small " << name.value(); + return false; + } + if (index == 0) { // Load the links file into memory with a single read. scoped_array<char> buf(new char[file_len]); diff --git a/net/disk_cache/block_files.h b/net/disk_cache/block_files.h index 5f1fa3c..6123c91 100644 --- a/net/disk_cache/block_files.h +++ b/net/disk_cache/block_files.h @@ -92,6 +92,7 @@ class BlockFiles { scoped_ptr<base::ThreadChecker> thread_checker_; FRIEND_TEST_ALL_PREFIXES(DiskCacheTest, BlockFiles_ZeroSizeFile); + FRIEND_TEST_ALL_PREFIXES(DiskCacheTest, BlockFiles_TruncatedFile); FRIEND_TEST_ALL_PREFIXES(DiskCacheTest, BlockFiles_InvalidFile); FRIEND_TEST_ALL_PREFIXES(DiskCacheTest, BlockFiles_Stats); diff --git a/net/disk_cache/block_files_unittest.cc b/net/disk_cache/block_files_unittest.cc index 90bf048..7ee08d3 100644 --- a/net/disk_cache/block_files_unittest.cc +++ b/net/disk_cache/block_files_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -177,6 +177,30 @@ TEST_F(DiskCacheTest, BlockFiles_ZeroSizeFile) { ASSERT_FALSE(files.Init(false)); } +// Handling of truncated files (non empty). +TEST_F(DiskCacheTest, BlockFiles_TruncatedFile) { + FilePath path = GetCacheFilePath(); + ASSERT_TRUE(DeleteCache(path)); + ASSERT_TRUE(file_util::CreateDirectory(path)); + + BlockFiles files(path); + ASSERT_TRUE(files.Init(true)); + Addr address; + EXPECT_TRUE(files.CreateBlock(RANKINGS, 2, &address)); + + FilePath filename = files.Name(0); + files.CloseFiles(); + // Truncate one of the files. + { + scoped_refptr<File> file(new File); + ASSERT_TRUE(file->Init(filename)); + EXPECT_TRUE(file->SetLength(15000)); + } + + // Initializing should fail, not crash. + ASSERT_FALSE(files.Init(false)); +} + // An invalid file can be detected after init. TEST_F(DiskCacheTest, BlockFiles_InvalidFile) { FilePath path = GetCacheFilePath(); diff --git a/net/disk_cache/file_posix.cc b/net/disk_cache/file_posix.cc index 087ff13..71fc1fb 100644 --- a/net/disk_cache/file_posix.cc +++ b/net/disk_cache/file_posix.cc @@ -8,6 +8,7 @@ #include "base/logging.h" #include "base/threading/worker_pool.h" +#include "net/base/net_errors.h" #include "net/disk_cache/disk_cache.h" #include "net/disk_cache/in_flight_io.h" @@ -92,7 +93,7 @@ void FileBackgroundIO::Read() { if (file_->Read(const_cast<void*>(buf_), buf_len_, offset_)) { result_ = static_cast<int>(buf_len_); } else { - result_ = -1; + result_ = net::ERR_CACHE_READ_FAILURE; } controller_->OnIOComplete(this); } @@ -101,7 +102,7 @@ void FileBackgroundIO::Read() { void FileBackgroundIO::Write() { bool rv = file_->Write(buf_, buf_len_, offset_); - result_ = rv ? static_cast<int>(buf_len_) : -1; + result_ = rv ? static_cast<int>(buf_len_) : net::ERR_CACHE_WRITE_FAILURE; controller_->OnIOComplete(this); } diff --git a/net/disk_cache/file_win.cc b/net/disk_cache/file_win.cc index 737b8e8..ed93511 100644 --- a/net/disk_cache/file_win.cc +++ b/net/disk_cache/file_win.cc @@ -7,6 +7,7 @@ #include "base/file_path.h" #include "base/lazy_instance.h" #include "base/message_loop.h" +#include "net/base/net_errors.h" #include "net/disk_cache/disk_cache.h" namespace { @@ -42,7 +43,7 @@ void CompletionHandler::OnIOCompleted(MessageLoopForIO::IOContext* context, if (error) { DCHECK(!actual_bytes); - actual_bytes = static_cast<DWORD>(-1); + actual_bytes = static_cast<DWORD>(net::ERR_CACHE_READ_FAILURE); NOTREACHED(); } |