From 93bed14e13dd5a6dd3d68bcf6d3c7c1f691f669b Mon Sep 17 00:00:00 2001 From: Kristian Monsen Date: Tue, 1 Nov 2011 14:30:59 +0000 Subject: Part of fix for bug 5523834, backporting cache fixes This is hopefully a fix for bug 5255299 Cherry-picking CL http://src.chromium.org/viewvc/chrome?view=rev&revision=92390 Change-Id: I2f9905bf2f53dd958eb17d1af789fcfb35224061 --- net/base/net_error_list.h | 3 ++- net/disk_cache/block_files.cc | 6 ++++++ net/disk_cache/block_files.h | 1 + net/disk_cache/block_files_unittest.cc | 26 +++++++++++++++++++++++++- net/disk_cache/file_posix.cc | 5 +++-- 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 6cdfa06..9e9a980 100644 --- a/net/base/net_error_list.h +++ b/net/base/net_error_list.h @@ -453,7 +453,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(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 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 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(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(buf_), buf_len_, offset_)) { result_ = static_cast(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(buf_len_) : -1; + result_ = rv ? static_cast(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(-1); + actual_bytes = static_cast(net::ERR_CACHE_READ_FAILURE); NOTREACHED(); } -- cgit v1.1