| Index: util/mach/exc_server_variants_test.cc
|
| diff --git a/util/mach/exc_server_variants_test.cc b/util/mach/exc_server_variants_test.cc
|
| index 4c9a7964b853c88f3d3e19e2c5ac65a286d3e9dd..8cf34d46ccf908ac25e63908d64f4d163ff553be 100644
|
| --- a/util/mach/exc_server_variants_test.cc
|
| +++ b/util/mach/exc_server_variants_test.cc
|
| @@ -23,6 +23,7 @@
|
| #include "gtest/gtest.h"
|
| #include "util/mach/exception_behaviors.h"
|
| #include "util/mach/mach_extensions.h"
|
| +#include "util/mach/mach_message_util.h"
|
| #include "util/test/mac/mach_errors.h"
|
| #include "util/test/mac/mach_multiprocess.h"
|
|
|
| @@ -82,7 +83,7 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseRequest {
|
| Head.msgh_bits =
|
| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, MACH_MSG_TYPE_PORT_SEND) |
|
| MACH_MSGH_BITS_COMPLEX;
|
| - Head.msgh_size = sizeof(*this);
|
| + Head.msgh_size = sizeof(*this) - sizeof(trailer);
|
| Head.msgh_remote_port = kClientRemotePort;
|
| Head.msgh_local_port = kServerLocalPort;
|
| Head.msgh_id = 2401;
|
| @@ -104,6 +105,7 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseRequest {
|
| exception_type_t exception;
|
| mach_msg_type_number_t codeCnt;
|
| integer_t code[2];
|
| + mach_msg_trailer_t trailer;
|
| };
|
|
|
| struct __attribute__((packed, aligned(4))) ExceptionRaiseReply {
|
| @@ -149,7 +151,7 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseStateRequest {
|
| memset(this, 0xa5, sizeof(*this));
|
| Head.msgh_bits =
|
| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, MACH_MSG_TYPE_PORT_SEND);
|
| - Head.msgh_size = sizeof(*this);
|
| + Head.msgh_size = sizeof(*this) - sizeof(trailer);
|
| Head.msgh_remote_port = kClientRemotePort;
|
| Head.msgh_local_port = kServerLocalPort;
|
| Head.msgh_id = 2402;
|
| @@ -166,6 +168,12 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseStateRequest {
|
| Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state);
|
| }
|
|
|
| + // Because the message size has been adjusted, the trailer may not appear in
|
| + // its home member variable. This computes the actual address of the trailer.
|
| + const mach_msg_trailer_t* Trailer() const {
|
| + return MachMessageTrailerFromHeader(&Head);
|
| + }
|
| +
|
| mach_msg_header_t Head;
|
| NDR_record_t NDR;
|
| exception_type_t exception;
|
| @@ -174,6 +182,7 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseStateRequest {
|
| int flavor;
|
| mach_msg_type_number_t old_stateCnt;
|
| natural_t old_state[THREAD_STATE_MAX];
|
| + mach_msg_trailer_t trailer;
|
| };
|
|
|
| struct __attribute__((packed, aligned(4))) ExceptionRaiseStateReply {
|
| @@ -232,7 +241,7 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseStateIdentityRequest {
|
| Head.msgh_bits =
|
| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, MACH_MSG_TYPE_PORT_SEND) |
|
| MACH_MSGH_BITS_COMPLEX;
|
| - Head.msgh_size = sizeof(*this);
|
| + Head.msgh_size = sizeof(*this) - sizeof(trailer);
|
| Head.msgh_remote_port = kClientRemotePort;
|
| Head.msgh_local_port = kServerLocalPort;
|
| Head.msgh_id = 2403;
|
| @@ -252,6 +261,12 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseStateIdentityRequest {
|
| Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state);
|
| }
|
|
|
| + // Because the message size has been adjusted, the trailer may not appear in
|
| + // its home member variable. This computes the actual address of the trailer.
|
| + const mach_msg_trailer_t* Trailer() const {
|
| + return MachMessageTrailerFromHeader(&Head);
|
| + }
|
| +
|
| mach_msg_header_t Head;
|
| mach_msg_body_t msgh_body;
|
| mach_msg_port_descriptor_t thread;
|
| @@ -263,6 +278,7 @@ struct __attribute__((packed, aligned(4))) ExceptionRaiseStateIdentityRequest {
|
| int flavor;
|
| mach_msg_type_number_t old_stateCnt;
|
| natural_t old_state[THREAD_STATE_MAX];
|
| + mach_msg_trailer_t trailer;
|
| };
|
|
|
| // The reply messages for exception_raise_state and
|
| @@ -275,7 +291,7 @@ struct __attribute__((packed, aligned(4))) MachExceptionRaiseRequest {
|
| Head.msgh_bits =
|
| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, MACH_MSG_TYPE_PORT_SEND) |
|
| MACH_MSGH_BITS_COMPLEX;
|
| - Head.msgh_size = sizeof(*this);
|
| + Head.msgh_size = sizeof(*this) - sizeof(trailer);
|
| Head.msgh_remote_port = kClientRemotePort;
|
| Head.msgh_local_port = kServerLocalPort;
|
| Head.msgh_id = 2405;
|
| @@ -297,6 +313,7 @@ struct __attribute__((packed, aligned(4))) MachExceptionRaiseRequest {
|
| exception_type_t exception;
|
| mach_msg_type_number_t codeCnt;
|
| int64_t code[2];
|
| + mach_msg_trailer_t trailer;
|
| };
|
|
|
| // The reply messages for exception_raise and mach_exception_raise are
|
| @@ -308,7 +325,7 @@ struct __attribute__((packed, aligned(4))) MachExceptionRaiseStateRequest {
|
| memset(this, 0xa5, sizeof(*this));
|
| Head.msgh_bits =
|
| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, MACH_MSG_TYPE_PORT_SEND);
|
| - Head.msgh_size = sizeof(*this);
|
| + Head.msgh_size = sizeof(*this) - sizeof(trailer);
|
| Head.msgh_remote_port = kClientRemotePort;
|
| Head.msgh_local_port = kServerLocalPort;
|
| Head.msgh_id = 2406;
|
| @@ -325,6 +342,12 @@ struct __attribute__((packed, aligned(4))) MachExceptionRaiseStateRequest {
|
| Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state);
|
| }
|
|
|
| + // Because the message size has been adjusted, the trailer may not appear in
|
| + // its home member variable. This computes the actual address of the trailer.
|
| + const mach_msg_trailer_t* Trailer() const {
|
| + return MachMessageTrailerFromHeader(&Head);
|
| + }
|
| +
|
| mach_msg_header_t Head;
|
| NDR_record_t NDR;
|
| exception_type_t exception;
|
| @@ -333,6 +356,7 @@ struct __attribute__((packed, aligned(4))) MachExceptionRaiseStateRequest {
|
| int flavor;
|
| mach_msg_type_number_t old_stateCnt;
|
| natural_t old_state[THREAD_STATE_MAX];
|
| + mach_msg_trailer_t trailer;
|
| };
|
|
|
| // The reply messages for exception_raise_state and mach_exception_raise_state
|
| @@ -346,7 +370,7 @@ struct __attribute__((packed,
|
| Head.msgh_bits =
|
| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, MACH_MSG_TYPE_PORT_SEND) |
|
| MACH_MSGH_BITS_COMPLEX;
|
| - Head.msgh_size = sizeof(*this);
|
| + Head.msgh_size = sizeof(*this) - sizeof(trailer);
|
| Head.msgh_remote_port = kClientRemotePort;
|
| Head.msgh_local_port = kServerLocalPort;
|
| Head.msgh_id = 2407;
|
| @@ -366,6 +390,12 @@ struct __attribute__((packed,
|
| Head.msgh_size += sizeof(old_state[0]) * old_stateCnt - sizeof(old_state);
|
| }
|
|
|
| + // Because the message size has been adjusted, the trailer may not appear in
|
| + // its home member variable. This computes the actual address of the trailer.
|
| + const mach_msg_trailer_t* Trailer() const {
|
| + return MachMessageTrailerFromHeader(&Head);
|
| + }
|
| +
|
| mach_msg_header_t Head;
|
| mach_msg_body_t msgh_body;
|
| mach_msg_port_descriptor_t thread;
|
| @@ -377,6 +407,7 @@ struct __attribute__((packed,
|
| int flavor;
|
| mach_msg_type_number_t old_stateCnt;
|
| natural_t old_state[THREAD_STATE_MAX];
|
| + mach_msg_trailer_t trailer;
|
| };
|
|
|
| // The reply messages for exception_raise_state_identity and
|
| @@ -449,6 +480,7 @@ class MockUniversalMachExcServer : public UniversalMachExcServer {
|
| mach_msg_type_number_t old_state_count,
|
| thread_state_t new_state,
|
| mach_msg_type_number_t* new_state_count,
|
| + const mach_msg_trailer_t* trailer,
|
| bool* destroy_complex_request) override {
|
| *destroy_complex_request = true;
|
| const ConstExceptionCodes exception_codes = {code, code_count};
|
| @@ -462,19 +494,21 @@ class MockUniversalMachExcServer : public UniversalMachExcServer {
|
| &exception_codes,
|
| flavor,
|
| &old_thread_state,
|
| - &new_thread_state);
|
| + &new_thread_state,
|
| + trailer);
|
| }
|
|
|
| - MOCK_METHOD9(MockCatchMachException,
|
| - kern_return_t(exception_behavior_t behavior,
|
| - exception_handler_t exception_port,
|
| - thread_t thread,
|
| - task_t task,
|
| - exception_type_t exception,
|
| - const ConstExceptionCodes* exception_codes,
|
| - thread_state_flavor_t* flavor,
|
| - const ConstThreadState* old_thread_state,
|
| - ThreadState* new_thread_state));
|
| + MOCK_METHOD10(MockCatchMachException,
|
| + kern_return_t(exception_behavior_t behavior,
|
| + exception_handler_t exception_port,
|
| + thread_t thread,
|
| + task_t task,
|
| + exception_type_t exception,
|
| + const ConstExceptionCodes* exception_codes,
|
| + thread_state_flavor_t* flavor,
|
| + const ConstThreadState* old_thread_state,
|
| + ThreadState* new_thread_state,
|
| + const mach_msg_trailer_t* trailer));
|
| };
|
|
|
| // Matcher for ConstExceptionCodes, testing that it carries 2 codes matching
|
| @@ -548,7 +582,7 @@ TEST(ExcServerVariants, MockExceptionRaise) {
|
| MockUniversalMachExcServer server;
|
|
|
| ExceptionRaiseRequest request;
|
| - EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize());
|
| + EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
|
|
|
| ExceptionRaiseReply reply;
|
| EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
|
| @@ -565,7 +599,8 @@ TEST(ExcServerVariants, MockExceptionRaise) {
|
| kTestExceptonCodes[1]),
|
| Pointee(Eq(THREAD_STATE_NONE)),
|
| IsThreadStateCount(0u),
|
| - IsThreadStateCount(0u)))
|
| + IsThreadStateCount(0u),
|
| + Eq(&request.trailer)))
|
| .WillOnce(Return(KERN_SUCCESS))
|
| .RetiresOnSaturation();
|
|
|
| @@ -585,7 +620,7 @@ TEST(ExcServerVariants, MockExceptionRaiseState) {
|
| MockUniversalMachExcServer server;
|
|
|
| ExceptionRaiseStateRequest request;
|
| - EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize());
|
| + EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
|
|
|
| ExceptionRaiseStateReply reply;
|
| EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
|
| @@ -603,7 +638,8 @@ TEST(ExcServerVariants, MockExceptionRaiseState) {
|
| AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]),
|
| Pointee(Eq(kThreadStateFlavor)),
|
| IsThreadStateCount(kThreadStateFlavorCount),
|
| - IsThreadStateCount(arraysize(reply.new_state))))
|
| + IsThreadStateCount(arraysize(reply.new_state)),
|
| + Eq(request.Trailer())))
|
| .WillOnce(Return(KERN_SUCCESS))
|
| .RetiresOnSaturation();
|
|
|
| @@ -626,7 +662,7 @@ TEST(ExcServerVariants, MockExceptionRaiseStateIdentity) {
|
| MockUniversalMachExcServer server;
|
|
|
| ExceptionRaiseStateIdentityRequest request;
|
| - EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize());
|
| + EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
|
|
|
| ExceptionRaiseStateIdentityReply reply;
|
| EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
|
| @@ -644,7 +680,8 @@ TEST(ExcServerVariants, MockExceptionRaiseStateIdentity) {
|
| AreExceptionCodes(kTestExceptonCodes[0], kTestExceptonCodes[1]),
|
| Pointee(Eq(kThreadStateFlavor)),
|
| IsThreadStateCount(kThreadStateFlavorCount),
|
| - IsThreadStateCount(arraysize(reply.new_state))))
|
| + IsThreadStateCount(arraysize(reply.new_state)),
|
| + Eq(request.Trailer())))
|
| .WillOnce(Return(KERN_SUCCESS))
|
| .RetiresOnSaturation();
|
|
|
| @@ -664,7 +701,7 @@ TEST(ExcServerVariants, MockMachExceptionRaise) {
|
| MockUniversalMachExcServer server;
|
|
|
| MachExceptionRaiseRequest request;
|
| - EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize());
|
| + EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
|
|
|
| MachExceptionRaiseReply reply;
|
| EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
|
| @@ -683,7 +720,8 @@ TEST(ExcServerVariants, MockMachExceptionRaise) {
|
| kTestMachExceptionCodes[1]),
|
| Pointee(Eq(THREAD_STATE_NONE)),
|
| IsThreadStateCount(0u),
|
| - IsThreadStateCount(0u)))
|
| + IsThreadStateCount(0u),
|
| + Eq(&request.trailer)))
|
| .WillOnce(Return(KERN_SUCCESS))
|
| .RetiresOnSaturation();
|
|
|
| @@ -703,7 +741,7 @@ TEST(ExcServerVariants, MockMachExceptionRaiseState) {
|
| MockUniversalMachExcServer server;
|
|
|
| MachExceptionRaiseStateRequest request;
|
| - EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize());
|
| + EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
|
|
|
| MachExceptionRaiseStateReply reply;
|
| EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
|
| @@ -722,7 +760,8 @@ TEST(ExcServerVariants, MockMachExceptionRaiseState) {
|
| kTestMachExceptionCodes[1]),
|
| Pointee(Eq(kThreadStateFlavor)),
|
| IsThreadStateCount(kThreadStateFlavorCount),
|
| - IsThreadStateCount(arraysize(reply.new_state))))
|
| + IsThreadStateCount(arraysize(reply.new_state)),
|
| + Eq(request.Trailer())))
|
| .WillOnce(Return(KERN_SUCCESS))
|
| .RetiresOnSaturation();
|
|
|
| @@ -745,7 +784,7 @@ TEST(ExcServerVariants, MockMachExceptionRaiseStateIdentity) {
|
| MockUniversalMachExcServer server;
|
|
|
| MachExceptionRaiseStateIdentityRequest request;
|
| - EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize());
|
| + EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
|
|
|
| MachExceptionRaiseStateIdentityReply reply;
|
| EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
|
| @@ -764,7 +803,8 @@ TEST(ExcServerVariants, MockMachExceptionRaiseStateIdentity) {
|
| kTestMachExceptionCodes[1]),
|
| Pointee(Eq(kThreadStateFlavor)),
|
| IsThreadStateCount(kThreadStateFlavorCount),
|
| - IsThreadStateCount(arraysize(reply.new_state))))
|
| + IsThreadStateCount(arraysize(reply.new_state)),
|
| + Eq(request.Trailer())))
|
| .WillOnce(Return(KERN_SUCCESS))
|
| .RetiresOnSaturation();
|
|
|
| @@ -871,6 +911,7 @@ class TestExcServerVariants : public UniversalMachExcServer,
|
| mach_msg_type_number_t old_state_count,
|
| thread_state_t new_state,
|
| mach_msg_type_number_t* new_state_count,
|
| + const mach_msg_trailer_t* trailer,
|
| bool* destroy_complex_request) override {
|
| *destroy_complex_request = true;
|
|
|
| @@ -917,6 +958,11 @@ class TestExcServerVariants : public UniversalMachExcServer,
|
| EXPECT_EQ(nullptr, new_state);
|
| }
|
|
|
| + EXPECT_EQ(implicit_cast<mach_msg_trailer_type_t>(MACH_MSG_TRAILER_FORMAT_0),
|
| + trailer->msgh_trailer_type);
|
| + EXPECT_EQ(REQUESTED_TRAILER_SIZE(kMachMessageOptions),
|
| + trailer->msgh_trailer_size);
|
| +
|
| return ExcServerSuccessfulReturnValue(behavior, false);
|
| }
|
|
|
| @@ -927,7 +973,7 @@ class TestExcServerVariants : public UniversalMachExcServer,
|
| kern_return_t kr =
|
| MachMessageServer::Run(this,
|
| LocalPort(),
|
| - MACH_MSG_OPTION_NONE,
|
| + kMachMessageOptions,
|
| MachMessageServer::kOneShot,
|
| MachMessageServer::kBlocking,
|
| MachMessageServer::kReceiveLargeError,
|
| @@ -954,6 +1000,9 @@ class TestExcServerVariants : public UniversalMachExcServer,
|
| mach_msg_type_number_t state_count_;
|
| bool handled_;
|
|
|
| + static const mach_msg_option_t kMachMessageOptions =
|
| + MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0);
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(TestExcServerVariants);
|
| };
|
|
|
|
|