From 45de8bf76e32b56e7beb427b99c64fb8e30c7db0 Mon Sep 17 00:00:00 2001 From: Dave Bort Date: Tue, 12 Sep 2017 16:39:53 -0700 Subject: [PATCH] Add generic VMAddress-related types This will allow sharing code that is currently hard-coded to use (e.g.) LinuxVMAddress or mach_vm_size_t. Change-Id: I7bf20600c73d4ec7d2a029754f9043a236a38e5a Reviewed-on: https://chromium-review.googlesource.com/677142 Reviewed-by: Mark Mentovai Commit-Queue: Dave Bort --- util/misc/address_types.h | 69 +++++++++++++++++++++++++ util/numeric/checked_vm_address_range.h | 36 +++++++++++++ util/util.gyp | 2 + 3 files changed, 107 insertions(+) create mode 100644 util/misc/address_types.h create mode 100644 util/numeric/checked_vm_address_range.h diff --git a/util/misc/address_types.h b/util/misc/address_types.h new file mode 100644 index 00000000..ce7694c3 --- /dev/null +++ b/util/misc/address_types.h @@ -0,0 +1,69 @@ +// Copyright 2017 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. + +#ifndef CRASHPAD_UTIL_MISC_ADDRESS_TYPES_H_ +#define CRASHPAD_UTIL_MISC_ADDRESS_TYPES_H_ + +#include + +#include + +#include "build/build_config.h" + +#if defined(OS_MACOSX) +#include +#elif defined(OS_WIN) +#include "util/win/address_types.h" +#elif defined(OS_LINUX) +#include "util/linux/address_types.h" +#else +#error "Unhandled OS type" +#endif + +namespace crashpad { + +#if DOXYGEN + +//! \brief Type used to represent an address in a process, potentially across +//! bitness. +using VMAddress = uint64_t; + +//! \brief Type used to represent the size of a memory range (with a +//! VMAddress), potentially across bitness. +using VMSize = uint64_t; + +#elif defined(OS_MACOSX) + +using VMAddress = mach_vm_address_t; +using VMSize = mach_vm_size_t; + +#elif defined(OS_WIN) + +using VMAddress = WinVMAddress; +using VMSize = WinVMSize; + +#elif defined(OS_LINUX) + +using VMAddress = LinuxVMAddress; +using VMSize = LinuxVMSize; + +#endif + +//! \brief Type used to represent an offset from a VMAddress, potentially +//! across bitness. +using VMOffset = std::make_signed::type; + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_MISC_ADDRESS_TYPES_H_ diff --git a/util/numeric/checked_vm_address_range.h b/util/numeric/checked_vm_address_range.h new file mode 100644 index 00000000..e792dba9 --- /dev/null +++ b/util/numeric/checked_vm_address_range.h @@ -0,0 +1,36 @@ +// Copyright 2017 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. + +#ifndef CRASHPAD_UTIL_NUMERIC_CHECKED_VM_ADDRESS_RANGE_H_ +#define CRASHPAD_UTIL_NUMERIC_CHECKED_VM_ADDRESS_RANGE_H_ + +#include "util/misc/address_types.h" +#include "util/numeric/checked_address_range.h" + +namespace crashpad { + +//! \brief Ensures that a range, composed of a base and a size, does not +//! overflow the pointer type of the process it describes a range in. +//! +//! This class checks bases of type #VMAddress and sizes of type #VMSize against +//! a process whose pointer type is either 32 or 64 bits wide. +//! +//! Aside from varying the overall range on the basis of a process’ pointer type +//! width, this class functions very similarly to CheckedRange. +using CheckedVMAddressRange = + internal::CheckedAddressRangeGeneric; + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_NUMERIC_CHECKED_VM_ADDRESS_RANGE_H_ diff --git a/util/util.gyp b/util/util.gyp index 31d4847e..f284bb21 100644 --- a/util/util.gyp +++ b/util/util.gyp @@ -110,6 +110,7 @@ 'mach/task_memory.cc', 'mach/task_memory.h', 'misc/address_sanitizer.h', + 'misc/address_types.h', 'misc/arraysize_unsafe.h', 'misc/clock.h', 'misc/clock_mac.cc', @@ -157,6 +158,7 @@ 'numeric/checked_address_range.cc', 'numeric/checked_address_range.h', 'numeric/checked_range.h', + 'numeric/checked_vm_address_range.h', 'numeric/in_range_cast.h', 'numeric/int128.h', 'numeric/safe_assignment.h',