Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(607)

Unified Diff: util/mach/mach_message_server.cc

Issue 781593003: MachMessageServer: add some DCHECKs (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698