| Index: third_party/crashpad/crashpad/util/win/registration_protocol_win.cc
|
| diff --git a/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc b/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc
|
| index eff27e2855028e1483fb027e5ae9e38837365f88..176384157e1d54844510c6bbead76de3d178ed42 100644
|
| --- a/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc
|
| +++ b/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc
|
| @@ -15,15 +15,18 @@
|
| #include "util/win/registration_protocol_win.h"
|
|
|
| #include <windows.h>
|
| +#include <sddl.h>
|
|
|
| #include "base/logging.h"
|
| +#include "util/win/exception_handler_server.h"
|
| #include "util/win/scoped_handle.h"
|
| +#include "util/win/scoped_local_alloc.h"
|
|
|
| namespace crashpad {
|
|
|
| bool SendToCrashHandlerServer(const base::string16& pipe_name,
|
| - const crashpad::ClientToServerMessage& message,
|
| - crashpad::ServerToClientMessage* response) {
|
| + const ClientToServerMessage& message,
|
| + ServerToClientMessage* response) {
|
| // Retry CreateFile() in a loop. If the handler isn’t actively waiting in
|
| // ConnectNamedPipe() on a pipe instance because it’s busy doing something
|
| // else, CreateFile() will fail with ERROR_PIPE_BUSY. WaitNamedPipe() waits
|
| @@ -39,7 +42,7 @@ bool SendToCrashHandlerServer(const base::string16& pipe_name,
|
| // around the same time as its client, something external to this code must be
|
| // done to guarantee correct ordering. When the client starts the handler
|
| // itself, CrashpadClient::StartHandler() provides this synchronization.
|
| - for (int tries = 0;;) {
|
| + for (;;) {
|
| ScopedFileHANDLE pipe(
|
| CreateFile(pipe_name.c_str(),
|
| GENERIC_READ | GENERIC_WRITE,
|
| @@ -49,13 +52,12 @@ bool SendToCrashHandlerServer(const base::string16& pipe_name,
|
| SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION,
|
| nullptr));
|
| if (!pipe.is_valid()) {
|
| - if (++tries == 5 || GetLastError() != ERROR_PIPE_BUSY) {
|
| + if (GetLastError() != ERROR_PIPE_BUSY) {
|
| PLOG(ERROR) << "CreateFile";
|
| return false;
|
| }
|
|
|
| - if (!WaitNamedPipe(pipe_name.c_str(), 1000) &&
|
| - GetLastError() != ERROR_SEM_TIMEOUT) {
|
| + if (!WaitNamedPipe(pipe_name.c_str(), NMPWAIT_WAIT_FOREVER)) {
|
| PLOG(ERROR) << "WaitNamedPipe";
|
| return false;
|
| }
|
| @@ -72,7 +74,7 @@ bool SendToCrashHandlerServer(const base::string16& pipe_name,
|
| BOOL result = TransactNamedPipe(
|
| pipe.get(),
|
| // This is [in], but is incorrectly declared non-const.
|
| - const_cast<crashpad::ClientToServerMessage*>(&message),
|
| + const_cast<ClientToServerMessage*>(&message),
|
| sizeof(message),
|
| response,
|
| sizeof(*response),
|
| @@ -91,4 +93,47 @@ bool SendToCrashHandlerServer(const base::string16& pipe_name,
|
| }
|
| }
|
|
|
| +HANDLE CreateNamedPipeInstance(const std::wstring& pipe_name,
|
| + bool first_instance) {
|
| + SECURITY_ATTRIBUTES security_attributes;
|
| + SECURITY_ATTRIBUTES* security_attributes_pointer = nullptr;
|
| + ScopedLocalAlloc scoped_sec_desc;
|
| +
|
| + if (first_instance) {
|
| + // Pre-Vista does not have integrity levels.
|
| + const DWORD version = GetVersion();
|
| + const DWORD major_version = LOBYTE(LOWORD(version));
|
| + const bool is_vista_or_later = major_version >= 6;
|
| + if (is_vista_or_later) {
|
| + // Mandatory Label, no ACE flags, no ObjectType, integrity level
|
| + // untrusted.
|
| + const wchar_t kSddl[] = L"S:(ML;;;;;S-1-16-0)";
|
| +
|
| + PSECURITY_DESCRIPTOR sec_desc;
|
| + PCHECK(ConvertStringSecurityDescriptorToSecurityDescriptor(
|
| + kSddl, SDDL_REVISION_1, &sec_desc, nullptr))
|
| + << "ConvertStringSecurityDescriptorToSecurityDescriptor";
|
| +
|
| + // Take ownership of the allocated SECURITY_DESCRIPTOR.
|
| + scoped_sec_desc.reset(sec_desc);
|
| +
|
| + memset(&security_attributes, 0, sizeof(security_attributes));
|
| + security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
|
| + security_attributes.lpSecurityDescriptor = sec_desc;
|
| + security_attributes.bInheritHandle = TRUE;
|
| + security_attributes_pointer = &security_attributes;
|
| + }
|
| + }
|
| +
|
| + return CreateNamedPipe(
|
| + pipe_name.c_str(),
|
| + PIPE_ACCESS_DUPLEX | (first_instance ? FILE_FLAG_FIRST_PIPE_INSTANCE : 0),
|
| + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
|
| + ExceptionHandlerServer::kPipeInstances,
|
| + 512,
|
| + 512,
|
| + 0,
|
| + security_attributes_pointer);
|
| +}
|
| +
|
| } // namespace crashpad
|
|
|