123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // Copyright 2013 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.
- #include "net/disk_cache/simple/simple_test_util.h"
- #include "base/files/file.h"
- #include "base/files/file_path.h"
- #include "net/base/hash_value.h"
- #include "net/disk_cache/simple/simple_entry_format.h"
- #include "net/disk_cache/simple/simple_util.h"
- namespace disk_cache::simple_util {
- using base::File;
- using base::FilePath;
- bool CreateCorruptFileForTests(const std::string& key,
- const FilePath& cache_path) {
- FilePath entry_file_path = cache_path.AppendASCII(
- disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
- int flags = File::FLAG_CREATE_ALWAYS | File::FLAG_WRITE;
- File entry_file(entry_file_path, flags);
- if (!entry_file.IsValid())
- return false;
- return entry_file.Write(0, "dummy", 1) == 1;
- }
- bool RemoveKeySHA256FromEntry(const std::string& key,
- const FilePath& cache_path) {
- FilePath entry_file_path = cache_path.AppendASCII(
- disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
- int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE;
- File entry_file(entry_file_path, flags);
- if (!entry_file.IsValid())
- return false;
- int64_t file_length = entry_file.GetLength();
- SimpleFileEOF eof_record;
- if (file_length < static_cast<int64_t>(sizeof(eof_record)))
- return false;
- if (entry_file.Read(file_length - sizeof(eof_record),
- reinterpret_cast<char*>(&eof_record),
- sizeof(eof_record)) != sizeof(eof_record)) {
- return false;
- }
- if (eof_record.final_magic_number != disk_cache::kSimpleFinalMagicNumber ||
- (eof_record.flags & SimpleFileEOF::FLAG_HAS_KEY_SHA256) !=
- SimpleFileEOF::FLAG_HAS_KEY_SHA256) {
- return false;
- }
- // Remove the key SHA256 flag, and rewrite the header on top of the
- // SHA256. Truncate the file afterwards, and we have an identical entry
- // lacking a key SHA256.
- eof_record.flags &= ~SimpleFileEOF::FLAG_HAS_KEY_SHA256;
- if (entry_file.Write(
- file_length - sizeof(eof_record) - sizeof(net::SHA256HashValue),
- reinterpret_cast<char*>(&eof_record),
- sizeof(eof_record)) != sizeof(eof_record)) {
- return false;
- }
- if (!entry_file.SetLength(file_length - sizeof(net::SHA256HashValue))) {
- return false;
- }
- return true;
- }
- bool CorruptKeySHA256FromEntry(const std::string& key,
- const base::FilePath& cache_path) {
- FilePath entry_file_path = cache_path.AppendASCII(
- disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
- int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE;
- File entry_file(entry_file_path, flags);
- if (!entry_file.IsValid())
- return false;
- int64_t file_length = entry_file.GetLength();
- SimpleFileEOF eof_record;
- if (file_length < static_cast<int64_t>(sizeof(eof_record)))
- return false;
- if (entry_file.Read(file_length - sizeof(eof_record),
- reinterpret_cast<char*>(&eof_record),
- sizeof(eof_record)) != sizeof(eof_record)) {
- return false;
- }
- if (eof_record.final_magic_number != disk_cache::kSimpleFinalMagicNumber ||
- (eof_record.flags & SimpleFileEOF::FLAG_HAS_KEY_SHA256) !=
- SimpleFileEOF::FLAG_HAS_KEY_SHA256) {
- return false;
- }
- const char corrupt_data[] = "corrupt data";
- static_assert(sizeof(corrupt_data) <= sizeof(net::SHA256HashValue),
- "corrupt data should not be larger than a SHA-256");
- if (entry_file.Write(
- file_length - sizeof(eof_record) - sizeof(net::SHA256HashValue),
- corrupt_data, sizeof(corrupt_data)) != sizeof(corrupt_data)) {
- return false;
- }
- return true;
- }
- bool CorruptStream0LengthFromEntry(const std::string& key,
- const base::FilePath& cache_path) {
- FilePath entry_file_path = cache_path.AppendASCII(
- disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
- int flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE;
- File entry_file(entry_file_path, flags);
- if (!entry_file.IsValid())
- return false;
- int64_t file_length = entry_file.GetLength();
- SimpleFileEOF eof_record;
- if (file_length < static_cast<int64_t>(sizeof(eof_record)))
- return false;
- if (entry_file.Read(file_length - sizeof(eof_record),
- reinterpret_cast<char*>(&eof_record),
- sizeof(eof_record)) != sizeof(eof_record)) {
- return false;
- }
- if (eof_record.final_magic_number != disk_cache::kSimpleFinalMagicNumber)
- return false;
- // Set the stream size to a clearly invalidly large value.
- eof_record.stream_size = std::numeric_limits<uint32_t>::max() - 50;
- if (entry_file.Write(file_length - sizeof(eof_record),
- reinterpret_cast<char*>(&eof_record),
- sizeof(eof_record)) != sizeof(eof_record)) {
- return false;
- }
- return true;
- }
- } // namespace disk_cache::simple_util
|