summaryrefslogtreecommitdiffstats
path: root/base/memory
diff options
context:
space:
mode:
authorjbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-15 05:37:49 +0000
committerjbauman@chromium.org <jbauman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-15 05:37:49 +0000
commit154c984b2bb4a99eddd4e0f2b79c452be2f59bd2 (patch)
treec1b842978c3810c9fcd95cb28c03cf13df3d0b86 /base/memory
parentdfd34848757ec4200740257704b650cb4f0fd417 (diff)
downloadchromium_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.h3
-rw-r--r--base/memory/shared_memory_nacl.cc3
-rw-r--r--base/memory/shared_memory_posix.cc3
-rw-r--r--base/memory/shared_memory_unittest.cc14
-rw-r--r--base/memory/shared_memory_win.cc3
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,