Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2319)

Unified Diff: base/files/memory_mapped_file.cc

Issue 1798203002: Support read/write memory-mapped files. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
+ }
+ 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;
}

Powered by Google App Engine
This is Rietveld 408576698