| Index: util/mach/mach_message_server.cc
|
| diff --git a/util/mach/mach_message_server.cc b/util/mach/mach_message_server.cc
|
| index c29680a61bd97b5e2f206ebe195ef240f9abc433..fea0b5d477644df29fc69374016a06fb9a6b5825 100644
|
| --- a/util/mach/mach_message_server.cc
|
| +++ b/util/mach/mach_message_server.cc
|
| @@ -14,6 +14,8 @@
|
|
|
| #include "util/mach/mach_message_server.h"
|
|
|
| +#include <string.h>
|
| +
|
| #include <limits>
|
|
|
| #include "base/logging.h"
|
| @@ -48,27 +50,32 @@ class MachMessageBuffer {
|
| // 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
|
| // a MachMessageServer::Run() loop.
|
| - if (size == vm_.size()) {
|
| - return KERN_SUCCESS;
|
| - }
|
| + if (size != vm_.size()) {
|
| + // reset() first, so that two allocations don’t exist simultaneously.
|
| + vm_.reset();
|
| +
|
| + 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;
|
| + }
|
|
|
| - // reset() first, so that two allocations don’t exist simultaneously.
|
| - vm_.reset();
|
| -
|
| - 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);
|
| }
|
|
|
| +#if !defined(NDEBUG)
|
| + // Regardless of whether the allocation was changed, scribble over the
|
| + // memory to make sure that nothing relies on zero-initialization or stale
|
| + // contents.
|
| + memset(Header(), 0x66, size);
|
| +#endif
|
| +
|
| return KERN_SUCCESS;
|
| }
|
|
|
|
|