Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Unified Diff: handler/win/registration_server.cc

Issue 1126783004: Introduce RegistrationServer. (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: handler/win/registration_server.cc
diff --git a/handler/win/registration_server.cc b/handler/win/registration_server.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e3d9c5832920311056a4611a920fef3dbd9c949c
--- /dev/null
+++ b/handler/win/registration_server.cc
@@ -0,0 +1,107 @@
+// Copyright 2015 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 "handler/win/registration_server.h"
+
+#include <windows.h>
+#include "client/registration_request_win.h"
Mark Mentovai 2015/05/05 20:20:33 Blank line before this.
erikwright (departed) 2015/05/20 17:10:15 Done.
+#include "client/registration_response_win.h"
+
+namespace crashpad {
+
+namespace {
+const int kNumThreads = 3;
Mark Mentovai 2015/05/05 20:20:33 This is only used in the constructor, it doesn’t n
erikwright (departed) 2015/05/20 17:10:15 Done.
+} // namespace
+
+RegistrationServer::RegistrationServer(const base::string16& pipe_name,
+ scoped_ptr<Delegate> delegate)
+ : delegate_(delegate.Pass()) {
Mark Mentovai 2015/05/05 20:20:33 Explicitly initialize everything even if it’s the
erikwright (departed) 2015/05/20 17:10:15 Done.
+ for (int i = 0; i < kNumThreads; ++i) {
+ DWORD open_mode = PIPE_ACCESS_DUPLEX;
+ if (i == 0)
+ open_mode |= FILE_FLAG_FIRST_PIPE_INSTANCE;
+ ScopedKernelHANDLE pipe(
+ ::CreateNamedPipe(pipe_name.c_str(), open_mode,
Mark Mentovai 2015/05/05 20:20:33 No :: in crashpad except where it’s needed to disa
erikwright (departed) 2015/05/20 17:10:16 Done.
+ PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
+ kNumThreads, 512, 512, 20, NULL));
Mark Mentovai 2015/05/05 20:20:33 What is the significance of 20?
Mark Mentovai 2015/05/05 20:20:33 In Crashpad, use nullptr, not NULL. Generally we d
erikwright (departed) 2015/05/20 17:10:16 Done.
erikwright (departed) 2015/05/20 17:10:16 Done.
+ if (pipe.is_valid()) {
+ listener_threads_.push_back(
+ new ListenerThread(pipe.Pass(), delegate_.get()));
+ listener_threads_.back()->Start();
+ }
+ }
+}
+
+RegistrationServer::~RegistrationServer() {
+ for (auto& thread : listener_threads_) {
+ thread->Stop();
+ }
+ for (auto& thread : listener_threads_) {
+ thread->Join();
+ delete thread;
Mark Mentovai 2015/05/05 20:20:33 Use a PointerVector<>.
erikwright (departed) 2015/05/20 17:10:16 Done.
+ }
+}
+
+RegistrationServer::ListenerThread::ListenerThread(
+ ScopedKernelHANDLE pipe,
Mark Mentovai 2015/05/05 20:20:33 This would fit on the preceding line.
erikwright (departed) 2015/05/20 17:10:16 Done.
+ Delegate* delegate)
+ : pipe_(pipe.Pass()),
+ delegate_(delegate) {
+}
+
+void RegistrationServer::ListenerThread::ThreadMain() {
+ while (true) {
+ if (!::ConnectNamedPipe(pipe_.get(), NULL)) {
+ if (::GetLastError() != ERROR_PIPE_CONNECTED)
+ break;
Mark Mentovai 2015/05/05 20:20:33 PLOG(ERROR)
erikwright (departed) 2015/05/20 17:10:16 Done.
+ }
+
+ DWORD bytes_read = 0;
+ RegistrationRequest request;
+ if (::ReadFile(pipe_.get(), &request, sizeof(request), &bytes_read, NULL)) {
+ if (bytes_read == sizeof(request)) {
+ ScopedKernelHANDLE client_process(::OpenProcess(
+ PROCESS_ALL_ACCESS, FALSE, request.client_process_id));
+ if (!client_process.is_valid()) {
+ if (::ImpersonateNamedPipeClient(pipe_.get())) {
+ client_process.reset(::OpenProcess(
+ PROCESS_ALL_ACCESS, FALSE, request.client_process_id));
+ ::RevertToSelf();
+ }
Mark Mentovai 2015/05/05 20:20:33 …otherwise? Is this something that should be logge
erikwright (departed) 2015/05/20 17:10:15 Done.
+ }
+
+ // TODO(erikwright): Verify that the client process ID is not forged.
+
+ if (client_process.is_valid()) {
+ RegistrationResponse response = {0};
+ if (delegate_->RegisterClient(client_process.Pass(),
+ request.crashpad_info_address,
+ &response.request_report_event,
+ &response.report_complete_event)) {
+ DWORD bytes_written = 0;
+ ::WriteFile(
Mark Mentovai 2015/05/05 20:20:33 Check everything.
erikwright (departed) 2015/05/20 17:10:15 Done.
+ pipe_.get(), &response, sizeof(response), &bytes_written, NULL);
+ }
+ }
+ }
+ }
+
+ ::DisconnectNamedPipe(pipe_.get());
+ }
+}
+
+void RegistrationServer::ListenerThread::Stop() { pipe_.reset(); }
+
+} // namespace crashpad
+
Mark Mentovai 2015/05/05 20:20:33 Get rid of the blank line here.
erikwright (departed) 2015/05/20 17:10:15 Done.

Powered by Google App Engine
This is Rietveld 408576698