Index: mojo/public/platform/native/system_impl_private_unittest.cc |
diff --git a/mojo/public/platform/native/system_impl_private_unittest.cc b/mojo/public/platform/native/system_impl_private_unittest.cc |
index 215ccd40e7cb4d8fc5fbbebe48039830088818fd..03fcafd69bbf2f7f2b5f32774a53a387f6024c5c 100644 |
--- a/mojo/public/platform/native/system_impl_private_unittest.cc |
+++ b/mojo/public/platform/native/system_impl_private_unittest.cc |
@@ -63,6 +63,18 @@ TEST(SystemImplTest, BasicMessagePipe) { |
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, h1, &rights)); |
EXPECT_EQ(kDefaultMessagePipeHandleRights, rights); |
+ // Shouldn't be able to duplicate either handle (just test "with reduced |
+ // rights" on one, and without on the other). |
+ MojoHandle handle_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ MojoSystemImplDuplicateHandleWithReducedRights( |
+ sys0, h0, MOJO_HANDLE_RIGHT_DUPLICATE, &handle_denied)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied); |
+ handle_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ MojoSystemImplDuplicateHandle(sys0, h1, &handle_denied)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied); |
+ |
// Move the other end of the pipe to a different SystemImpl. |
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplTransferHandle(sys0, h1, sys1, &h1)); |
EXPECT_NE(h1, MOJO_HANDLE_INVALID); |
@@ -182,6 +194,18 @@ TEST(SystemImplTest, BasicDataPipe) { |
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys0, hc, &rights)); |
EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights); |
+ // Shouldn't be able to duplicate either handle (just test "with reduced |
+ // rights" on one, and without on the other). |
+ MojoHandle handle_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ MojoSystemImplDuplicateHandleWithReducedRights( |
+ sys0, hp, MOJO_HANDLE_RIGHT_DUPLICATE, &handle_denied)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied); |
+ handle_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ MojoSystemImplDuplicateHandle(sys0, hc, &handle_denied)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied); |
+ |
// Move the other end of the pipe to a different SystemImpl. |
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplTransferHandle(sys0, hc, sys1, &hc)); |
EXPECT_NE(hc, MOJO_HANDLE_INVALID); |
@@ -599,11 +623,8 @@ TEST(SystemImplTest, BasicSharedBuffer) { |
MojoSystemImpl sys1 = MojoSystemImplCreateImpl(); |
EXPECT_NE(sys0, sys1); |
- MojoHandle h0, h1; |
- void* pointer; |
- |
// Create a shared buffer (|h0|). |
- h0 = MOJO_HANDLE_INVALID; |
+ MojoHandle h0 = MOJO_HANDLE_INVALID; |
EXPECT_EQ(MOJO_RESULT_OK, |
MojoSystemImplCreateSharedBuffer(sys0, nullptr, kSize, &h0)); |
EXPECT_NE(h0, MOJO_HANDLE_INVALID); |
@@ -624,7 +645,7 @@ TEST(SystemImplTest, BasicSharedBuffer) { |
} |
// Map everything. |
- pointer = nullptr; |
+ void* pointer = nullptr; |
EXPECT_EQ(MOJO_RESULT_OK, |
MojoSystemImplMapBuffer(sys0, h0, 0u, kSize, &pointer, |
MOJO_MAP_BUFFER_FLAG_NONE)); |
@@ -632,10 +653,10 @@ TEST(SystemImplTest, BasicSharedBuffer) { |
static_cast<char*>(pointer)[kSize / 2] = 'x'; |
// Duplicate |h0| to |h1|. |
- h1 = MOJO_HANDLE_INVALID; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- MojoSystemImplDuplicateBufferHandle(sys0, h0, nullptr, &h1)); |
+ MojoHandle h1 = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplDuplicateHandle(sys0, h0, &h1)); |
EXPECT_NE(h1, MOJO_HANDLE_INVALID); |
+ EXPECT_NE(h1, h0); |
// The new handle should have the correct rights. |
rights = MOJO_HANDLE_RIGHT_NONE; |
@@ -679,7 +700,25 @@ TEST(SystemImplTest, BasicSharedBuffer) { |
// Unmap it. |
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplUnmapBuffer(sys1, pointer)); |
+ // Test duplication with reduced rights. |
+ MojoHandle h2 = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplDuplicateHandleWithReducedRights( |
+ sys1, h1, MOJO_HANDLE_RIGHT_DUPLICATE, &h2)); |
+ EXPECT_NE(h2, MOJO_HANDLE_INVALID); |
+ EXPECT_NE(h2, h1); |
+ // |h2| should have the correct rights. |
+ rights = MOJO_HANDLE_RIGHT_NONE; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetRights(sys1, h2, &rights)); |
+ EXPECT_EQ(kDefaultSharedBufferHandleRights & ~MOJO_HANDLE_RIGHT_DUPLICATE, |
+ rights); |
+ // Trying to duplicate |h2| should fail. |
+ MojoHandle h3 = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ MojoSystemImplDuplicateHandle(sys1, h2, &h3)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h3); |
+ |
EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplClose(sys1, h1)); |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplClose(sys1, h2)); |
// 2 SystemImpls are leaked... |
} |