diff options
author | jbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-15 05:37:49 +0000 |
---|---|---|
committer | jbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-15 05:37:49 +0000 |
commit | 154c984b2bb4a99eddd4e0f2b79c452be2f59bd2 (patch) | |
tree | c1b842978c3810c9fcd95cb28c03cf13df3d0b86 /base/memory | |
parent | dfd34848757ec4200740257704b650cb4f0fd417 (diff) | |
download | chromium_src-154c984b2bb4a99eddd4e0f2b79c452be2f59bd2.zip chromium_src-154c984b2bb4a99eddd4e0f2b79c452be2f59bd2.tar.gz chromium_src-154c984b2bb4a99eddd4e0f2b79c452be2f59bd2.tar.bz2 |
Disallow calling Map on currently-mapped SharedMemory
This would leak the previous mapping of the memory.
BUG=
Review URL: https://codereview.chromium.org/195893022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257300 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/memory')
-rw-r--r-- | base/memory/shared_memory.h | 3 | ||||
-rw-r--r-- | base/memory/shared_memory_nacl.cc | 3 | ||||
-rw-r--r-- | base/memory/shared_memory_posix.cc | 3 | ||||
-rw-r--r-- | base/memory/shared_memory_unittest.cc | 14 | ||||
-rw-r--r-- | base/memory/shared_memory_win.cc | 3 |
5 files changed, 24 insertions, 2 deletions
diff --git a/base/memory/shared_memory.h b/base/memory/shared_memory.h index 8e32e72..27c3747 100644 --- a/base/memory/shared_memory.h +++ b/base/memory/shared_memory.h @@ -154,7 +154,8 @@ class BASE_EXPORT SharedMemory { // Maps the shared memory into the caller's address space. // Returns true on success, false otherwise. The memory address // is accessed via the memory() accessor. The mapped address is guaranteed to - // have an alignment of at least MAP_MINIMUM_ALIGNMENT. + // have an alignment of at least MAP_MINIMUM_ALIGNMENT. This method will fail + // if this object is currently mapped. bool Map(size_t bytes) { return MapAt(0, bytes); } diff --git a/base/memory/shared_memory_nacl.cc b/base/memory/shared_memory_nacl.cc index 7647400..39625ee 100644 --- a/base/memory/shared_memory_nacl.cc +++ b/base/memory/shared_memory_nacl.cc @@ -91,6 +91,9 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { if (bytes > static_cast<size_t>(std::numeric_limits<int>::max())) return false; + if (memory_) + return false; + memory_ = mmap(NULL, bytes, PROT_READ | (read_only_ ? 0 : PROT_WRITE), MAP_SHARED, mapped_file_, offset); diff --git a/base/memory/shared_memory_posix.cc b/base/memory/shared_memory_posix.cc index 1a90847..1756c29 100644 --- a/base/memory/shared_memory_posix.cc +++ b/base/memory/shared_memory_posix.cc @@ -279,6 +279,9 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { if (bytes > static_cast<size_t>(std::numeric_limits<int>::max())) return false; + if (memory_) + return false; + #if defined(OS_ANDROID) // On Android, Map can be called with a size and offset of zero to use the // ashmem-determined size. diff --git a/base/memory/shared_memory_unittest.cc b/base/memory/shared_memory_unittest.cc index b8999f6..f2a9e74 100644 --- a/base/memory/shared_memory_unittest.cc +++ b/base/memory/shared_memory_unittest.cc @@ -477,7 +477,6 @@ TEST(SharedMemoryTest, MapAt) { SharedMemory memory; ASSERT_TRUE(memory.CreateAndMapAnonymous(kDataSize)); - ASSERT_TRUE(memory.Map(kDataSize)); uint32* ptr = static_cast<uint32*>(memory.memory()); ASSERT_NE(ptr, static_cast<void*>(NULL)); @@ -497,6 +496,19 @@ TEST(SharedMemoryTest, MapAt) { } } +TEST(SharedMemoryTest, MapTwice) { + const uint32 kDataSize = 1024; + SharedMemory memory; + bool rv = memory.CreateAndMapAnonymous(kDataSize); + EXPECT_TRUE(rv); + + void* old_address = memory.memory(); + + rv = memory.Map(kDataSize); + EXPECT_FALSE(rv); + EXPECT_EQ(old_address, memory.memory()); +} + #if defined(OS_POSIX) // Create a shared memory object, mmap it, and mprotect it to PROT_EXEC. TEST(SharedMemoryTest, AnonymousExecutable) { diff --git a/base/memory/shared_memory_win.cc b/base/memory/shared_memory_win.cc index c9d603e..cc177ab 100644 --- a/base/memory/shared_memory_win.cc +++ b/base/memory/shared_memory_win.cc @@ -164,6 +164,9 @@ bool SharedMemory::MapAt(off_t offset, size_t bytes) { if (bytes > static_cast<size_t>(std::numeric_limits<int>::max())) return false; + if (memory_) + return false; + memory_ = MapViewOfFile(mapped_file_, read_only_ ? FILE_MAP_READ : FILE_MAP_READ | FILE_MAP_WRITE, |