Chromium Code Reviews| Index: base/files/memory_mapped_file.cc |
| diff --git a/base/files/memory_mapped_file.cc b/base/files/memory_mapped_file.cc |
| index 0fd9d6796b10734a1224556ad16ab0d2418662f9..67890d68855cb810a086da788d2f046f78240d25 100644 |
| --- a/base/files/memory_mapped_file.cc |
| +++ b/base/files/memory_mapped_file.cc |
| @@ -30,18 +30,30 @@ MemoryMappedFile::~MemoryMappedFile() { |
| } |
| #if !defined(OS_NACL) |
| -bool MemoryMappedFile::Initialize(const FilePath& file_name) { |
| +bool MemoryMappedFile::Initialize(const FilePath& file_name, Access access) { |
| if (IsValid()) |
| return false; |
| - file_.Initialize(file_name, File::FLAG_OPEN | File::FLAG_READ); |
| + uint32_t flags = 0; |
| + switch (access) { |
| + case READ_ONLY: |
| + flags = File::FLAG_OPEN | File::FLAG_READ; |
| + break; |
| + case READ_WRITE: |
| + flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; |
| + break; |
| + case READ_WRITE_EXTEND: |
| + // Can't open with "extend" because no maximum size is known. |
| + NOTREACHED(); |
|
erikchen
2016/05/10 02:21:51
Should this be a CHECK(false) instead?
danakj
2016/05/10 20:52:02
Only if you think we're going to ship code that do
bcwhite
2016/05/10 21:00:54
Not really necessary. A non-DCHECK build would ge
|
| + } |
| + file_.Initialize(file_name, flags); |
| if (!file_.IsValid()) { |
| DLOG(ERROR) << "Couldn't open " << file_name.AsUTF8Unsafe(); |
| return false; |
| } |
| - if (!MapFileRegionToMemory(Region::kWholeFile)) { |
| + if (!MapFileRegionToMemory(Region::kWholeFile, access)) { |
| CloseHandles(); |
| return false; |
| } |
| @@ -49,11 +61,32 @@ bool MemoryMappedFile::Initialize(const FilePath& file_name) { |
| return true; |
| } |
| -bool MemoryMappedFile::Initialize(File file) { |
| - return Initialize(std::move(file), Region::kWholeFile); |
| +bool MemoryMappedFile::Initialize(File file, Access access) { |
| + DCHECK_NE(READ_WRITE_EXTEND, access); |
| + return Initialize(std::move(file), Region::kWholeFile, access); |
| } |
| -bool MemoryMappedFile::Initialize(File file, const Region& region) { |
| +bool MemoryMappedFile::Initialize(File file, |
| + const Region& region, |
| + Access access) { |
| + switch (access) { |
| + case READ_WRITE_EXTEND: |
| + // Ensure that the extended size is within limits of File. |
| + if (region.size > std::numeric_limits<int64_t>::max() - region.offset) { |
| + DLOG(ERROR) << "Region bounds exceed maximum for base::File."; |
| + return false; |
| + } |
| + // Fall through. |
| + case READ_ONLY: |
| + case READ_WRITE: |
| + // Ensure that the region values are valid. |
| + if (region.offset < 0 || region.size < 0) { |
| + DLOG(ERROR) << "Region bounds are not valid."; |
| + return false; |
| + } |
| + break; |
| + } |
| + |
| if (IsValid()) |
| return false; |
| @@ -64,7 +97,7 @@ bool MemoryMappedFile::Initialize(File file, const Region& region) { |
| file_ = std::move(file); |
| - if (!MapFileRegionToMemory(region)) { |
| + if (!MapFileRegionToMemory(region, access)) { |
| CloseHandles(); |
| return false; |
| } |