| Index: util/mac/process_types/custom.cc
|
| diff --git a/util/mac/process_types/custom.cc b/util/mac/process_types/custom.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1de19ff9219d50968978c9d550ef777099627475
|
| --- /dev/null
|
| +++ b/util/mac/process_types/custom.cc
|
| @@ -0,0 +1,95 @@
|
| +// Copyright 2014 The Crashpad Authors. All rights reserved.
|
| +//
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +// you may not use this file except in compliance with the License.
|
| +// You may obtain a copy of the License at
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +// distributed under the License is distributed on an "AS IS" BASIS,
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// See the License for the specific language governing permissions and
|
| +// limitations under the License.
|
| +
|
| +#include "util/mac/process_types.h"
|
| +
|
| +#include <string.h>
|
| +
|
| +#include "util/mac/process_types/internal.h"
|
| +#include "util/mach/task_memory.h"
|
| +
|
| +namespace crashpad {
|
| +namespace process_types {
|
| +namespace internal {
|
| +
|
| +template <typename Traits>
|
| +bool dyld_all_image_infos<Traits>::ReadInto(
|
| + ProcessReader* process_reader,
|
| + mach_vm_address_t address,
|
| + dyld_all_image_infos<Traits>* specific) {
|
| + TaskMemory* task_memory = process_reader->Memory();
|
| + if (!task_memory->Read(
|
| + address, sizeof(specific->version), &specific->version)) {
|
| + return false;
|
| + }
|
| +
|
| + mach_vm_size_t size;
|
| + if (specific->version >= 14) {
|
| + size = sizeof(dyld_all_image_infos<Traits>);
|
| + } else if (specific->version >= 13) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, reserved);
|
| + } else if (specific->version >= 12) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, sharedCacheUUID);
|
| + } else if (specific->version >= 11) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, sharedCacheSlide);
|
| + } else if (specific->version >= 10) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, errorKind);
|
| + } else if (specific->version >= 9) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, initialImageCount);
|
| + } else if (specific->version >= 8) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, dyldAllImageInfosAddress);
|
| + } else if (specific->version >= 7) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, uuidArrayCount);
|
| + } else if (specific->version >= 6) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, systemOrderFlag);
|
| + } else if (specific->version >= 5) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, coreSymbolicationShmPage);
|
| + } else if (specific->version >= 3) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, dyldVersion);
|
| + } else if (specific->version >= 2) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, jitInfo);
|
| + } else if (specific->version >= 1) {
|
| + size = offsetof(dyld_all_image_infos<Traits>, libSystemInitialized);
|
| + } else {
|
| + size = offsetof(dyld_all_image_infos<Traits>, infoArrayCount);
|
| + }
|
| +
|
| + if (!task_memory->Read(address, size, specific)) {
|
| + return false;
|
| + }
|
| +
|
| + // Zero out the rest of the structure in case anything accesses fields without
|
| + // checking the version.
|
| + size_t remaining = sizeof(*specific) - size;
|
| + if (remaining > 0) {
|
| + char* start = reinterpret_cast<char*>(specific) + size;
|
| + memset(start, 0, remaining);
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +#define PROCESS_TYPE_FLAVOR_TRAITS(lp_bits) \
|
| + template bool dyld_all_image_infos<Traits##lp_bits>::ReadInto( \
|
| + ProcessReader*, \
|
| + mach_vm_address_t, \
|
| + dyld_all_image_infos<Traits##lp_bits>*);
|
| +
|
| +#include "util/mac/process_types/flavors.h"
|
| +
|
| +#undef PROCESS_TYPE_FLAVOR_TRAITS
|
| +
|
| +} // namespace internal
|
| +} // namespace process_types
|
| +} // namespace crashpad
|
|
|