mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-09 22:16:13 +00:00
mac: Deal with bootstrap_look_up() race encountered on 10.12.1
bootstrap_look_up() “successfully” returns MACH_PORT_DEAD about half of the time on 10.12.1 16B2657 (xnu-3789.21.4). Replace that with MACH_PORT_NULL in the BootstrapLookUp() wrapper that all callers are already routed through. BUG=crashpad:139 TEST=crashpad_util_test MachExtensions.BootstrapCheckInAndLookUp Change-Id: I9a39b709add5ca7e64bb5b970ed6ba3fdfd1d47a Reviewed-on: https://chromium-review.googlesource.com/409671 Reviewed-by: Robert Sesek <rsesek@chromium.org>
This commit is contained in:
parent
3abde199a7
commit
741c9cc51e
@ -157,7 +157,26 @@ base::mac::ScopedMachReceiveRight BootstrapCheckIn(
|
||||
|
||||
base::mac::ScopedMachSendRight BootstrapLookUp(
|
||||
const std::string& service_name) {
|
||||
return BootstrapCheckInOrLookUp<BootstrapLookUpTraits>(service_name);
|
||||
base::mac::ScopedMachSendRight send(
|
||||
BootstrapCheckInOrLookUp<BootstrapLookUpTraits>(service_name));
|
||||
|
||||
// It’s possible to race the bootstrap server when the receive right
|
||||
// corresponding to the looked-up send right is destroyed immediately before
|
||||
// the bootstrap_look_up() call. If the bootstrap server believes that
|
||||
// |service_name| is still registered before processing the port-destroyed
|
||||
// notification sent to it by the kernel, it will respond to a
|
||||
// bootstrap_look_up() request with a send right that has become a dead name,
|
||||
// which will be returned to the bootstrap_look_up() caller, translated into
|
||||
// the caller’s IPC port name space, as the special MACH_PORT_DEAD port name.
|
||||
// Check for that and return MACH_PORT_NULL in its place, as though the
|
||||
// bootstrap server had fully processed the port-destroyed notification before
|
||||
// responding to bootstrap_look_up().
|
||||
if (send.get() == MACH_PORT_DEAD) {
|
||||
LOG(ERROR) << "bootstrap_look_up " << service_name << ": service is dead";
|
||||
send.reset();
|
||||
}
|
||||
|
||||
return send;
|
||||
}
|
||||
|
||||
base::mac::ScopedMachSendRight SystemCrashReporterHandler() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user