Index: base/shared_memory_unittest.cc |
diff --git a/base/shared_memory_unittest.cc b/base/shared_memory_unittest.cc |
index 9f69a5d7a942b4951d6ec76591913bfb2b15b149..def4a607b112d81bc17fa5e2b253efa0cfbb95e5 100644 |
--- a/base/shared_memory_unittest.cc |
+++ b/base/shared_memory_unittest.cc |
@@ -15,6 +15,10 @@ |
#include "base/mac/scoped_nsautorelease_pool.h" |
#endif |
+#if defined(OS_POSIX) |
+#include <sys/mman.h> |
+#endif |
+ |
static const int kNumThreads = 5; |
static const int kNumTasks = 5; |
@@ -42,7 +46,7 @@ class MultipleThreadMain : public PlatformThread::Delegate { |
#endif |
const uint32 kDataSize = 1024; |
SharedMemory memory; |
- bool rv = memory.CreateNamed(s_test_name_, true, kDataSize); |
+ bool rv = memory.CreateNamed(s_test_name_, true, kDataSize, false); |
EXPECT_TRUE(rv); |
rv = memory.Map(kDataSize); |
EXPECT_TRUE(rv); |
@@ -91,7 +95,7 @@ class MultipleLockThread : public PlatformThread::Delegate { |
{ |
SharedMemory memory1; |
EXPECT_TRUE(memory1.CreateNamed("SharedMemoryMultipleLockThreadTest", |
- true, kDataSize)); |
+ true, kDataSize, false)); |
EXPECT_TRUE(memory1.ShareToProcess(GetCurrentProcess(), &handle)); |
// TODO(paulg): Implement this once we have a posix version of |
// SharedMemory::ShareToProcess. |
@@ -136,7 +140,7 @@ TEST(SharedMemoryTest, OpenClose) { |
EXPECT_TRUE(rv); |
rv = memory1.Open(test_name, false); |
EXPECT_FALSE(rv); |
- rv = memory1.CreateNamed(test_name, false, kDataSize); |
+ rv = memory1.CreateNamed(test_name, false, kDataSize, false); |
EXPECT_TRUE(rv); |
rv = memory1.Map(kDataSize); |
EXPECT_TRUE(rv); |
@@ -182,7 +186,7 @@ TEST(SharedMemoryTest, OpenExclusive) { |
// Open two handles to a memory segment and check that open_existing works |
// as expected. |
SharedMemory memory1; |
- bool rv = memory1.CreateNamed(test_name, false, kDataSize); |
+ bool rv = memory1.CreateNamed(test_name, false, kDataSize, false); |
EXPECT_TRUE(rv); |
// Memory1 knows it's size because it created it. |
@@ -195,11 +199,11 @@ TEST(SharedMemoryTest, OpenExclusive) { |
SharedMemory memory2; |
// Should not be able to create if openExisting is false. |
- rv = memory2.CreateNamed(test_name, false, kDataSize2); |
+ rv = memory2.CreateNamed(test_name, false, kDataSize2, false); |
EXPECT_FALSE(rv); |
// Should be able to create with openExisting true. |
- rv = memory2.CreateNamed(test_name, true, kDataSize2); |
+ rv = memory2.CreateNamed(test_name, true, kDataSize2, false); |
EXPECT_TRUE(rv); |
// Memory2 shouldn't know the size because we didn't create it. |
@@ -332,6 +336,21 @@ TEST(SharedMemoryTest, AnonymousPrivate) { |
} |
} |
+#if defined(OS_POSIX) |
+// Create a shared memory object, mmap it, and mprotect it to PROT_EXEC. |
+TEST(SharedMemoryTest, AnonymousExecutable) { |
+ const uint32 kTestSize = 1 << 16; |
+ |
+ SharedMemory shared_memory; |
+ |
+ EXPECT_TRUE(shared_memory.CreateAnonymous(kTestSize, true)); |
+ EXPECT_TRUE(shared_memory.Map(shared_memory.created_size())); |
+ |
+ EXPECT_EQ(0, mprotect(shared_memory.memory(), shared_memory.created_size(), |
+ PROT_READ | PROT_EXEC)); |
+} |
+#endif |
+ |
// On POSIX it is especially important we test shmem across processes, |
// not just across threads. But the test is enabled on all platforms. |
class SharedMemoryProcessTest : public MultiProcessTest { |
@@ -349,7 +368,7 @@ class SharedMemoryProcessTest : public MultiProcessTest { |
#endif |
const uint32 kDataSize = 1024; |
SharedMemory memory; |
- bool rv = memory.CreateNamed(s_test_name_, true, kDataSize); |
+ bool rv = memory.CreateNamed(s_test_name_, true, kDataSize, false); |
EXPECT_TRUE(rv); |
if (rv != true) |
errors++; |