From 6af23a933a0dc10cda072570cc02efcd03488a90 Mon Sep 17 00:00:00 2001 From: Sigurdur Asgeirsson Date: Wed, 8 Feb 2017 10:38:09 -0500 Subject: [PATCH] Use best-effort allocation in ProcessInfo::BuildHandleVector. BUG=crashpad:158 Change-Id: If8666140a7fc5315eeb791d0998226de89a22cc3 Reviewed-on: https://chromium-review.googlesource.com/438791 Reviewed-by: Mark Mentovai Reviewed-by: Scott Graham --- DEPS | 2 +- util/win/process_info.cc | 25 +++++++++++++++++++++---- util/win/process_info.h | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/DEPS b/DEPS index db8c048c..0da988b7 100644 --- a/DEPS +++ b/DEPS @@ -38,7 +38,7 @@ deps = { 'crashpad/third_party/mini_chromium/mini_chromium': Var('chromium_git') + '/chromium/mini_chromium@' + - '4f3cfc8e7c2b7d77f94f41a32c3ec84a6920f05d', + 'f65519e442d23498937251e680a3b113927613b0', } hooks = [ diff --git a/util/win/process_info.cc b/util/win/process_info.cc index d05a23d1..2e285b8b 100644 --- a/util/win/process_info.cc +++ b/util/win/process_info.cc @@ -19,9 +19,12 @@ #include #include #include +#include #include #include "base/logging.h" +#include "base/memory/free_deleter.h" +#include "base/process/memory.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "util/numeric/safe_assignment.h" @@ -36,6 +39,16 @@ namespace crashpad { namespace { +using UniqueMallocPtr = std::unique_ptr; + +UniqueMallocPtr UncheckedAllocate(size_t size) { + void* raw_ptr = nullptr; + if (!base::UncheckedMalloc(size, &raw_ptr)) + return UniqueMallocPtr(); + + return UniqueMallocPtr(new (raw_ptr) uint8_t[size]); +} + NTSTATUS NtQueryInformationProcess(HANDLE process_handle, PROCESSINFOCLASS process_information_class, PVOID process_information, @@ -347,14 +360,20 @@ bool ReadMemoryInfo(HANDLE process, bool is_64_bit, ProcessInfo* process_info) { std::vector ProcessInfo::BuildHandleVector( HANDLE process) const { ULONG buffer_size = 2 * 1024 * 1024; - std::unique_ptr buffer(new uint8_t[buffer_size]); - // Typically if the buffer were too small, STATUS_INFO_LENGTH_MISMATCH would // return the correct size in the final argument, but it does not for // SystemExtendedHandleInformation, so we loop and attempt larger sizes. NTSTATUS status; ULONG returned_length; + UniqueMallocPtr buffer; for (int tries = 0; tries < 5; ++tries) { + buffer.reset(); + buffer = UncheckedAllocate(buffer_size); + if (!buffer) { + LOG(ERROR) << "UncheckedAllocate"; + return std::vector(); + } + status = crashpad::NtQuerySystemInformation( static_cast(SystemExtendedHandleInformation), buffer.get(), @@ -364,8 +383,6 @@ std::vector ProcessInfo::BuildHandleVector( break; buffer_size *= 2; - buffer.reset(); - buffer.reset(new uint8_t[buffer_size]); } if (!NT_SUCCESS(status)) { diff --git a/util/win/process_info.h b/util/win/process_info.h index 0bb8d735..be968f92 100644 --- a/util/win/process_info.h +++ b/util/win/process_info.h @@ -170,6 +170,7 @@ class ProcessInfo { bool is_64_bit, ProcessInfo* process_info); + // This function is best-effort under low memory conditions. std::vector BuildHandleVector(HANDLE process) const; pid_t process_id_;