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

Side by Side Diff: handler/mac/exception_handler_server.cc

Issue 1409073013: mac: Make crashpad_handler get its receive right from its client (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « handler/mac/exception_handler_server.h ('k') | handler/main.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Crashpad Authors. All rights reserved. 1 // Copyright 2014 The Crashpad Authors. All rights reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 mach_msg_type_number_t code_count, 118 mach_msg_type_number_t code_count,
119 thread_state_flavor_t* flavor, 119 thread_state_flavor_t* flavor,
120 ConstThreadState old_state, 120 ConstThreadState old_state,
121 mach_msg_type_number_t old_state_count, 121 mach_msg_type_number_t old_state_count,
122 thread_state_t new_state, 122 thread_state_t new_state,
123 mach_msg_type_number_t* new_state_count, 123 mach_msg_type_number_t* new_state_count,
124 const mach_msg_trailer_t* trailer, 124 const mach_msg_trailer_t* trailer,
125 bool* destroy_complex_request) override { 125 bool* destroy_complex_request) override {
126 if (exception_port != exception_port_) { 126 if (exception_port != exception_port_) {
127 LOG(WARNING) << "exception port mismatch"; 127 LOG(WARNING) << "exception port mismatch";
128 return MIG_BAD_ID; 128 return KERN_FAILURE;
129 } 129 }
130 130
131 return exception_interface_->CatchMachException(behavior, 131 return exception_interface_->CatchMachException(behavior,
132 exception_port, 132 exception_port,
133 thread, 133 thread,
134 task, 134 task,
135 exception, 135 exception,
136 code, 136 code,
137 code_count, 137 code_count,
138 flavor, 138 flavor,
(...skipping 26 matching lines...) Expand all
165 notify_port_t notify, 165 notify_port_t notify,
166 mach_port_mscount_t mscount, 166 mach_port_mscount_t mscount,
167 const mach_msg_trailer_t* trailer) override { 167 const mach_msg_trailer_t* trailer) override {
168 if (notify != notify_port_) { 168 if (notify != notify_port_) {
169 // The message was received as part of a port set. This check ensures that 169 // The message was received as part of a port set. This check ensures that
170 // only the authorized sender of the no-senders notification is able to 170 // only the authorized sender of the no-senders notification is able to
171 // stop the exception server. Otherwise, a malicious client would be able 171 // stop the exception server. Otherwise, a malicious client would be able
172 // to craft and send a no-senders notification via its exception port, and 172 // to craft and send a no-senders notification via its exception port, and
173 // cause the handler to stop processing exceptions and exit. 173 // cause the handler to stop processing exceptions and exit.
174 LOG(WARNING) << "notify port mismatch"; 174 LOG(WARNING) << "notify port mismatch";
175 return MIG_BAD_ID; 175 return KERN_FAILURE;
176 } 176 }
177 177
178 running_ = false; 178 running_ = false;
179 179
180 return KERN_SUCCESS; 180 return KERN_SUCCESS;
181 } 181 }
182 182
183 kern_return_t DoMachNotifySendOnce( 183 kern_return_t DoMachNotifySendOnce(
184 notify_port_t notify, 184 notify_port_t notify,
185 const mach_msg_trailer_t* trailer) override { 185 const mach_msg_trailer_t* trailer) override {
186 return UnimplementedNotifyRoutine(notify); 186 return UnimplementedNotifyRoutine(notify);
187 } 187 }
188 188
189 kern_return_t DoMachNotifyDeadName( 189 kern_return_t DoMachNotifyDeadName(
190 notify_port_t notify, 190 notify_port_t notify,
191 mach_port_name_t name, 191 mach_port_name_t name,
192 const mach_msg_trailer_t* trailer) override { 192 const mach_msg_trailer_t* trailer) override {
193 return UnimplementedNotifyRoutine(notify); 193 return UnimplementedNotifyRoutine(notify);
194 } 194 }
195 195
196 private: 196 private:
197 kern_return_t UnimplementedNotifyRoutine(notify_port_t notify) { 197 kern_return_t UnimplementedNotifyRoutine(notify_port_t notify) {
198 // Most of the routines in the notify subsystem are not expected to be 198 // Most of the routines in the notify subsystem are not expected to be
199 // called. 199 // called.
200 if (notify != notify_port_) { 200 if (notify != notify_port_) {
201 LOG(WARNING) << "notify port mismatch"; 201 LOG(WARNING) << "notify port mismatch";
202 return MIG_BAD_ID; 202 return KERN_FAILURE;
203 } 203 }
204 204
205 NOTREACHED(); 205 NOTREACHED();
206 return KERN_FAILURE; 206 return MIG_BAD_ID;
207 } 207 }
208 208
209 UniversalMachExcServer mach_exc_server_; 209 UniversalMachExcServer mach_exc_server_;
210 NotifyServer notify_server_; 210 NotifyServer notify_server_;
211 CompositeMachMessageServer composite_mach_message_server_; 211 CompositeMachMessageServer composite_mach_message_server_;
212 UniversalMachExcServer::Interface* exception_interface_; // weak 212 UniversalMachExcServer::Interface* exception_interface_; // weak
213 mach_port_t exception_port_; // weak 213 mach_port_t exception_port_; // weak
214 base::mac::ScopedMachReceiveRight notify_port_; 214 base::mac::ScopedMachReceiveRight notify_port_;
215 bool running_; 215 bool running_;
216 216
217 DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServerRun); 217 DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServerRun);
218 }; 218 };
219 219
220 } // namespace 220 } // namespace
221 221
222 ExceptionHandlerServer::ExceptionHandlerServer() 222 ExceptionHandlerServer::ExceptionHandlerServer(
223 : receive_port_(NewMachPort(MACH_PORT_RIGHT_RECEIVE)) { 223 base::mac::ScopedMachReceiveRight receive_port)
224 : receive_port_(receive_port.Pass()) {
224 CHECK(receive_port_.is_valid()); 225 CHECK(receive_port_.is_valid());
225 } 226 }
226 227
227 ExceptionHandlerServer::~ExceptionHandlerServer() { 228 ExceptionHandlerServer::~ExceptionHandlerServer() {
228 } 229 }
229 230
230 void ExceptionHandlerServer::Run( 231 void ExceptionHandlerServer::Run(
231 UniversalMachExcServer::Interface* exception_interface) { 232 UniversalMachExcServer::Interface* exception_interface) {
232 ExceptionHandlerServerRun run(receive_port_.get(), exception_interface); 233 ExceptionHandlerServerRun run(receive_port_.get(), exception_interface);
233 run.Run(); 234 run.Run();
234 } 235 }
235 236
236 } // namespace crashpad 237 } // namespace crashpad
OLDNEW
« no previous file with comments | « handler/mac/exception_handler_server.h ('k') | handler/main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698