Index: mojo/public/c/system/tests/core_unittest.cc |
diff --git a/mojo/public/c/system/tests/core_unittest.cc b/mojo/public/c/system/tests/core_unittest.cc |
index 4e3686048511dafe62c6e7a3dbe888786de4cd82..aeba1eeb3aea1021f3ff5068ed58793b919675ce 100644 |
--- a/mojo/public/c/system/tests/core_unittest.cc |
+++ b/mojo/public/c/system/tests/core_unittest.cc |
@@ -63,6 +63,19 @@ TEST(CoreTest, InvalidHandle) { |
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
MojoGetRights(MOJO_HANDLE_INVALID, &rights)); |
+ // DuplicateHandleWithReducedRights: |
+ MojoHandle new_handle = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ MojoDuplicateHandleWithReducedRights( |
+ MOJO_HANDLE_INVALID, MOJO_HANDLE_RIGHT_DUPLICATE, &new_handle)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, new_handle); |
+ |
+ // DuplicateHandle: |
+ new_handle = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ MojoDuplicateHandle(MOJO_HANDLE_INVALID, &new_handle)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, new_handle); |
+ |
// Wait: |
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
MojoWait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, 1000000u, |
@@ -160,6 +173,18 @@ TEST(CoreTest, BasicMessagePipe) { |
EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(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, |
+ MojoDuplicateHandleWithReducedRights( |
+ 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, |
+ MojoDuplicateHandle(h1, &handle_denied)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied); |
+ |
// Shouldn't be readable, we haven't written anything. |
MojoHandleSignalsState state; |
EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
@@ -265,6 +290,18 @@ TEST(CoreTest, MAYBE_BasicDataPipe) { |
EXPECT_EQ(MOJO_RESULT_OK, MojoGetRights(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, |
+ MojoDuplicateHandleWithReducedRights( |
+ 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, |
+ MojoDuplicateHandle(hc, &handle_denied)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, handle_denied); |
+ |
// The consumer |hc| shouldn't be readable. |
MojoHandleSignalsState state; |
EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
@@ -614,11 +651,9 @@ TEST(CoreTest, DataPipeReadThreshold) { |
#define MAYBE_BasicSharedBuffer BasicSharedBuffer |
#endif |
TEST(CoreTest, MAYBE_BasicSharedBuffer) { |
- MojoHandle h0, h1; |
- void* pointer; |
// Create a shared buffer (|h0|). |
- h0 = MOJO_HANDLE_INVALID; |
+ MojoHandle h0 = MOJO_HANDLE_INVALID; |
EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0)); |
EXPECT_NE(h0, MOJO_HANDLE_INVALID); |
@@ -636,16 +671,17 @@ TEST(CoreTest, MAYBE_BasicSharedBuffer) { |
EXPECT_EQ(100u, info.num_bytes); |
// Map everything. |
- pointer = nullptr; |
+ void* pointer = nullptr; |
EXPECT_EQ(MOJO_RESULT_OK, |
MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE)); |
ASSERT_TRUE(pointer); |
static_cast<char*>(pointer)[50] = 'x'; |
// Duplicate |h0| to |h1|. |
- h1 = MOJO_HANDLE_INVALID; |
- EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, nullptr, &h1)); |
+ MojoHandle h1 = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateHandle(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; |
@@ -681,7 +717,24 @@ TEST(CoreTest, MAYBE_BasicSharedBuffer) { |
// Unmap it. |
EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer)); |
+ // Test duplication with reduced rights. |
+ MojoHandle h2 = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateHandleWithReducedRights( |
+ 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, MojoGetRights(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, MojoDuplicateHandle(h2, &h3)); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h3); |
+ |
EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1)); |
+ EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2)); |
} |
// This checks that things actually work in C (not C++). |