MachMessageServer: Make request messages const.

There’s no reason that “in” or “request” messages should be non-const.
This makes them const, bridges the const gap left by the MIG-generated
“check” functions with wrappers, and uses non-const fields in
“out” messages instead of const fields in “in” messages for in-out
parameters.

TEST=util_test ExcServerVariants.*:MachMessageServer.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/564533002
This commit is contained in:
Mark Mentovai 2014-09-10 18:57:14 -04:00
parent a01c87059b
commit fbf12950fe
4 changed files with 92 additions and 39 deletions

View File

@ -143,6 +143,58 @@ enum MachMessageID : mach_msg_id_t {
kMachMessageIDMachExceptionRaiseStateIdentity = 2407,
};
// The MIG-generated __MIG_check__Request__*() functions are not declared as
// accepting const data, but they could have been because they in fact do not
// modify the data. These wrapper functions are provided to bridge the const gap
// between the code in this file, which is const-correct and treats request
// message data as const, and those generated functions.
kern_return_t MIGCheckRequestExceptionRaise(
const __Request__exception_raise_t* in_request) {
typedef __Request__exception_raise_t Request;
return __MIG_check__Request__exception_raise_t(
const_cast<Request*>(in_request));
}
kern_return_t MIGCheckRequestExceptionRaiseState(
const __Request__exception_raise_state_t* in_request,
const __Request__exception_raise_state_t** in_request_1) {
typedef __Request__exception_raise_state_t Request;
return __MIG_check__Request__exception_raise_state_t(
const_cast<Request*>(in_request), const_cast<Request**>(in_request_1));
}
kern_return_t MIGCheckRequestExceptionRaiseStateIdentity(
const __Request__exception_raise_state_identity_t* in_request,
const __Request__exception_raise_state_identity_t** in_request_1) {
typedef __Request__exception_raise_state_identity_t Request;
return __MIG_check__Request__exception_raise_state_identity_t(
const_cast<Request*>(in_request), const_cast<Request**>(in_request_1));
}
kern_return_t MIGCheckRequestMachExceptionRaise(
const __Request__mach_exception_raise_t* in_request) {
typedef __Request__mach_exception_raise_t Request;
return __MIG_check__Request__mach_exception_raise_t(
const_cast<Request*>(in_request));
}
kern_return_t MIGCheckRequestMachExceptionRaiseState(
const __Request__mach_exception_raise_state_t* in_request,
const __Request__mach_exception_raise_state_t** in_request_1) {
typedef __Request__mach_exception_raise_state_t Request;
return __MIG_check__Request__mach_exception_raise_state_t(
const_cast<Request*>(in_request), const_cast<Request**>(in_request_1));
}
kern_return_t MIGCheckRequestMachExceptionRaiseStateIdentity(
const __Request__mach_exception_raise_state_identity_t* in_request,
const __Request__mach_exception_raise_state_identity_t** in_request_1) {
typedef __Request__mach_exception_raise_state_identity_t Request;
return __MIG_check__Request__mach_exception_raise_state_identity_t(
const_cast<Request*>(in_request), const_cast<Request**>(in_request_1));
}
} // namespace
namespace crashpad {
@ -153,7 +205,7 @@ ExcServer::ExcServer(ExcServer::Interface* interface)
interface_(interface) {
}
bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
bool ExcServer::MachMessageServerFunction(const mach_msg_header_t* in_header,
mach_msg_header_t* out_header,
bool* destroy_complex_request) {
PrepareReplyFromRequest(in_header, out_header);
@ -162,8 +214,8 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
case kMachMessageIDExceptionRaise: {
// exception_raise(), catch_exception_raise().
typedef __Request__exception_raise_t Request;
Request* in_request = reinterpret_cast<Request*>(in_header);
kern_return_t kr = __MIG_check__Request__exception_raise_t(in_request);
const Request* in_request = reinterpret_cast<const Request*>(in_header);
kern_return_t kr = MIGCheckRequestExceptionRaise(in_request);
if (kr != MACH_MSG_SUCCESS) {
SetReplyError(out_header, kr);
return true;
@ -190,12 +242,12 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
case kMachMessageIDExceptionRaiseState: {
// exception_raise_state(), catch_exception_raise_state().
typedef __Request__exception_raise_state_t Request;
Request* in_request = reinterpret_cast<Request*>(in_header);
const Request* in_request = reinterpret_cast<const Request*>(in_header);
// in_request_1 is used for the portion of the request after the codes,
// which in theory can be variable-length. The check function will set it.
Request* in_request_1;
kern_return_t kr = __MIG_check__Request__exception_raise_state_t(
const Request* in_request_1;
kern_return_t kr = MIGCheckRequestExceptionRaiseState(
in_request, &in_request_1);
if (kr != MACH_MSG_SUCCESS) {
SetReplyError(out_header, kr);
@ -204,13 +256,14 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
typedef __Reply__exception_raise_state_t Reply;
Reply* out_reply = reinterpret_cast<Reply*>(out_header);
out_reply->flavor = in_request_1->flavor;
out_reply->new_stateCnt = arraysize(out_reply->new_state);
out_reply->RetCode =
interface_->CatchExceptionRaiseState(in_header->msgh_local_port,
in_request->exception,
in_request->code,
in_request->codeCnt,
&in_request_1->flavor,
&out_reply->flavor,
in_request_1->old_state,
in_request_1->old_stateCnt,
out_reply->new_state,
@ -219,7 +272,6 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
return true;
}
out_reply->flavor = in_request_1->flavor;
out_header->msgh_size =
sizeof(*out_reply) - sizeof(out_reply->new_state) +
sizeof(out_reply->new_state[0]) * out_reply->new_stateCnt;
@ -230,12 +282,12 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
// exception_raise_state_identity(),
// catch_exception_raise_state_identity().
typedef __Request__exception_raise_state_identity_t Request;
Request* in_request = reinterpret_cast<Request*>(in_header);
const Request* in_request = reinterpret_cast<const Request*>(in_header);
// in_request_1 is used for the portion of the request after the codes,
// which in theory can be variable-length. The check function will set it.
Request* in_request_1;
kern_return_t kr = __MIG_check__Request__exception_raise_state_identity_t(
const Request* in_request_1;
kern_return_t kr = MIGCheckRequestExceptionRaiseStateIdentity(
in_request, &in_request_1);
if (kr != MACH_MSG_SUCCESS) {
SetReplyError(out_header, kr);
@ -244,6 +296,7 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
typedef __Reply__exception_raise_state_identity_t Reply;
Reply* out_reply = reinterpret_cast<Reply*>(out_header);
out_reply->flavor = in_request_1->flavor;
out_reply->new_stateCnt = arraysize(out_reply->new_state);
out_reply->RetCode = interface_->CatchExceptionRaiseStateIdentity(
in_header->msgh_local_port,
@ -252,7 +305,7 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
in_request->exception,
in_request->code,
in_request->codeCnt,
&in_request_1->flavor,
&out_reply->flavor,
in_request_1->old_state,
in_request_1->old_stateCnt,
out_reply->new_state,
@ -262,7 +315,6 @@ bool ExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
return true;
}
out_reply->flavor = in_request_1->flavor;
out_header->msgh_size =
sizeof(*out_reply) - sizeof(out_reply->new_state) +
sizeof(out_reply->new_state[0]) * out_reply->new_stateCnt;
@ -287,7 +339,8 @@ MachExcServer::MachExcServer(MachExcServer::Interface* interface)
interface_(interface) {
}
bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
bool MachExcServer::MachMessageServerFunction(
const mach_msg_header_t* in_header,
mach_msg_header_t* out_header,
bool* destroy_complex_request) {
PrepareReplyFromRequest(in_header, out_header);
@ -296,9 +349,8 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
case kMachMessageIDMachExceptionRaise: {
// mach_exception_raise(), catch_mach_exception_raise().
typedef __Request__mach_exception_raise_t Request;
Request* in_request = reinterpret_cast<Request*>(in_header);
kern_return_t kr =
__MIG_check__Request__mach_exception_raise_t(in_request);
const Request* in_request = reinterpret_cast<const Request*>(in_header);
kern_return_t kr = MIGCheckRequestMachExceptionRaise(in_request);
if (kr != MACH_MSG_SUCCESS) {
SetReplyError(out_header, kr);
return true;
@ -325,12 +377,12 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
case kMachMessageIDMachExceptionRaiseState: {
// mach_exception_raise_state(), catch_mach_exception_raise_state().
typedef __Request__mach_exception_raise_state_t Request;
Request* in_request = reinterpret_cast<Request*>(in_header);
const Request* in_request = reinterpret_cast<const Request*>(in_header);
// in_request_1 is used for the portion of the request after the codes,
// which in theory can be variable-length. The check function will set it.
Request* in_request_1;
kern_return_t kr = __MIG_check__Request__mach_exception_raise_state_t(
const Request* in_request_1;
kern_return_t kr = MIGCheckRequestMachExceptionRaiseState(
in_request, &in_request_1);
if (kr != MACH_MSG_SUCCESS) {
SetReplyError(out_header, kr);
@ -339,13 +391,14 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
typedef __Reply__mach_exception_raise_state_t Reply;
Reply* out_reply = reinterpret_cast<Reply*>(out_header);
out_reply->flavor = in_request_1->flavor;
out_reply->new_stateCnt = arraysize(out_reply->new_state);
out_reply->RetCode =
interface_->CatchMachExceptionRaiseState(in_header->msgh_local_port,
in_request->exception,
in_request->code,
in_request->codeCnt,
&in_request_1->flavor,
&out_reply->flavor,
in_request_1->old_state,
in_request_1->old_stateCnt,
out_reply->new_state,
@ -354,7 +407,6 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
return true;
}
out_reply->flavor = in_request_1->flavor;
out_header->msgh_size =
sizeof(*out_reply) - sizeof(out_reply->new_state) +
sizeof(out_reply->new_state[0]) * out_reply->new_stateCnt;
@ -365,13 +417,12 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
// mach_exception_raise_state_identity(),
// catch_mach_exception_raise_state_identity().
typedef __Request__mach_exception_raise_state_identity_t Request;
Request* in_request = reinterpret_cast<Request*>(in_header);
const Request* in_request = reinterpret_cast<const Request*>(in_header);
// in_request_1 is used for the portion of the request after the codes,
// which in theory can be variable-length. The check function will set it.
Request* in_request_1;
kern_return_t kr =
__MIG_check__Request__mach_exception_raise_state_identity_t(
const Request* in_request_1;
kern_return_t kr = MIGCheckRequestMachExceptionRaiseStateIdentity(
in_request, &in_request_1);
if (kr != MACH_MSG_SUCCESS) {
SetReplyError(out_header, kr);
@ -380,6 +431,7 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
typedef __Reply__mach_exception_raise_state_identity_t Reply;
Reply* out_reply = reinterpret_cast<Reply*>(out_header);
out_reply->flavor = in_request_1->flavor;
out_reply->new_stateCnt = arraysize(out_reply->new_state);
out_reply->RetCode = interface_->CatchMachExceptionRaiseStateIdentity(
in_header->msgh_local_port,
@ -388,7 +440,7 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
in_request->exception,
in_request->code,
in_request->codeCnt,
&in_request_1->flavor,
&out_reply->flavor,
in_request_1->old_state,
in_request_1->old_stateCnt,
out_reply->new_state,
@ -398,7 +450,6 @@ bool MachExcServer::MachMessageServerFunction(mach_msg_header_t* in_header,
return true;
}
out_reply->flavor = in_request_1->flavor;
out_header->msgh_size =
sizeof(*out_reply) - sizeof(out_reply->new_state) +
sizeof(out_reply->new_state[0]) * out_reply->new_stateCnt;
@ -603,7 +654,7 @@ UniversalMachExcServer::UniversalMachExcServer()
}
bool UniversalMachExcServer::MachMessageServerFunction(
mach_msg_header_t* in_header,
const mach_msg_header_t* in_header,
mach_msg_header_t* out_header,
bool* destroy_complex_request) {
switch (in_header->msgh_id) {

View File

@ -104,7 +104,7 @@ class ExcServer : public MachMessageServer::Interface {
// MachMessageServer::Interface:
virtual bool MachMessageServerFunction(
mach_msg_header_t* in_header,
const mach_msg_header_t* in_header,
mach_msg_header_t* out_header,
bool* destroy_complex_request) override;
@ -192,7 +192,7 @@ class MachExcServer : public MachMessageServer::Interface {
// MachMessageServer::Interface:
virtual bool MachMessageServerFunction(
mach_msg_header_t* in_header,
const mach_msg_header_t* in_header,
mach_msg_header_t* out_header,
bool* destroy_complex_request) override;
@ -402,7 +402,7 @@ class UniversalMachExcServer
// MachMessageServer::Interface:
virtual bool MachMessageServerFunction(
mach_msg_header_t* in_header,
const mach_msg_header_t* in_header,
mach_msg_header_t* out_header,
bool* destroy_complex_request) override;

View File

@ -37,7 +37,9 @@ class MachMessageServer {
//! may call such a function directly. This method is expected to behave
//! exactly as these functions behave.
//!
//! \param[in] in The request message, received as a Mach message.
//! \param[in] in The request message, received as a Mach message. Note that
//! this interface uses a `const` parameter for this purpose, whereas
//! MIG-generated “demux” functions do not.
//! \param[out] out The reply message. The caller allocates storage, and the
//! callee is expected to populate the reply message appropriately.
//! After returning, the caller will send this reply as a Mach message
@ -62,7 +64,7 @@ class MachMessageServer {
//! the reply message should be set as `mig_reply_error_t::RetCode`. The
//! non-`void` return value is used for increased compatibility with
//! MIG-generated functions.
virtual bool MachMessageServerFunction(mach_msg_header_t* in,
virtual bool MachMessageServerFunction(const mach_msg_header_t* in,
mach_msg_header_t* out,
bool* destroy_complex_request) = 0;

View File

@ -181,7 +181,7 @@ class TestMachMessageServer : public MachMessageServer::Interface,
// MachMessageServerInterface:
virtual bool MachMessageServerFunction(
mach_msg_header_t* in,
const mach_msg_header_t* in,
mach_msg_header_t* out,
bool* destroy_complex_request) override {
*destroy_complex_request = options_.server_destroy_complex;
@ -200,7 +200,7 @@ class TestMachMessageServer : public MachMessageServer::Interface,
};
const ReceiveRequestMessage* request =
reinterpret_cast<ReceiveRequestMessage*>(in);
reinterpret_cast<const ReceiveRequestMessage*>(in);
const mach_msg_bits_t expect_msgh_bits =
MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND, MACH_MSG_TYPE_MOVE_SEND) |
(options_.client_send_complex ? MACH_MSGH_BITS_COMPLEX : 0);