Index: util/mach/mach_message_server.cc |
diff --git a/util/mach/mach_message_server.cc b/util/mach/mach_message_server.cc |
index b2d99a143a90a0003102c9aaa879e46df2e4a4de..c29680a61bd97b5e2f206ebe195ef240f9abc433 100644 |
--- a/util/mach/mach_message_server.cc |
+++ b/util/mach/mach_message_server.cc |
@@ -43,7 +43,7 @@ class MachMessageBuffer { |
//! If the existing buffer is a different size, it will be reallocated without |
//! copying any of the old buffer’s contents to the new buffer. The contents |
//! of the buffer are unspecified after this call, even if no reallocation is |
- //! made. |
+ //! performed. |
kern_return_t Reallocate(vm_size_t size) { |
// This test uses == instead of > so that a large reallocation to receive a |
// large message doesn’t cause permanent memory bloat for the duration of |
@@ -55,17 +55,20 @@ class MachMessageBuffer { |
// reset() first, so that two allocations don’t exist simultaneously. |
vm_.reset(); |
- vm_address_t address; |
- kern_return_t kr = |
- vm_allocate(mach_task_self(), |
- &address, |
- size, |
- VM_FLAGS_ANYWHERE | VM_MAKE_TAG(VM_MEMORY_MACH_MSG)); |
- if (kr != KERN_SUCCESS) { |
- return kr; |
+ if (size) { |
+ vm_address_t address; |
+ kern_return_t kr = |
+ vm_allocate(mach_task_self(), |
+ &address, |
+ size, |
+ VM_FLAGS_ANYWHERE | VM_MAKE_TAG(VM_MEMORY_MACH_MSG)); |
+ if (kr != KERN_SUCCESS) { |
+ return kr; |
+ } |
+ |
+ vm_.reset(address, size); |
} |
- vm_.reset(address, size); |
return KERN_SUCCESS; |
} |
@@ -141,12 +144,14 @@ mach_msg_return_t MachMessageServer::Run(Interface* interface, |
const mach_msg_size_t request_size = (receive_large == kReceiveLargeResize) |
? round_page(expected_receive_size) |
: expected_receive_size; |
+ DCHECK_GE(request_size, sizeof(mach_msg_empty_rcv_t)); |
// mach_msg_server() and mach_msg_server_once() would consider whether |
// |options| contains MACH_SEND_TRAILER and include MAX_TRAILER_SIZE in this |
// computation if it does, but that option is ineffective on OS X. |
- const mach_msg_size_t reply_alloc = |
- round_page(interface->MachMessageServerReplySize()); |
+ const mach_msg_size_t reply_size = interface->MachMessageServerReplySize(); |
+ DCHECK_GE(reply_size, sizeof(mach_msg_empty_send_t)); |
+ const mach_msg_size_t reply_alloc = round_page(reply_size); |
MachMessageBuffer request; |
MachMessageBuffer reply; |
@@ -184,6 +189,7 @@ mach_msg_return_t MachMessageServer::Run(Interface* interface, |
case kReceiveLargeResize: { |
mach_msg_size_t this_request_size = round_page( |
round_msg(request.Header()->msgh_size) + trailer_alloc); |
+ DCHECK_GT(this_request_size, request_size); |
kr = MachMessageAllocateReceive(&request, |
options & ~MACH_RCV_LARGE, |