Index: sandbox/mac/launchd_interception_server.cc |
diff --git a/sandbox/mac/launchd_interception_server.cc b/sandbox/mac/launchd_interception_server.cc |
index 919f207ba84f4f9dd206e3ca0d07114dab42cd7b..3cb1821b3951971d25b64d161ae3c03eceeef765 100644 |
--- a/sandbox/mac/launchd_interception_server.cc |
+++ b/sandbox/mac/launchd_interception_server.cc |
@@ -76,6 +76,12 @@ bool LaunchdInterceptionServer::Initialize() { |
return false; |
} |
sandbox_port_.reset(port); |
+ if ((kr = mach_port_insert_right(task, sandbox_port_, sandbox_port_, |
+ MACH_MSG_TYPE_MAKE_SEND) != KERN_SUCCESS)) { |
+ MACH_LOG(ERROR, kr) << "Failed to allocate dummy sandbox port send right."; |
+ return false; |
+ } |
+ sandbox_send_port_.reset(sandbox_port_); |
// Set up the dispatch queue to service the bootstrap port. |
// TODO(rsesek): Specify DISPATCH_QUEUE_SERIAL, in the 10.7 SDK. NULL means |
@@ -216,16 +222,13 @@ void LaunchdInterceptionServer::HandleLookUp(mach_msg_header_t* request, |
else |
result_port = rule.substitute_port; |
- // Grant an additional send right on the result_port so that it can be |
- // sent to the sandboxed child process. |
- kern_return_t kr = mach_port_insert_right(mach_task_self(), |
- result_port, result_port, MACH_MSG_TYPE_MAKE_SEND); |
- if (kr != KERN_SUCCESS) { |
- MACH_LOG(ERROR, kr) << "Unable to insert right on result_port."; |
- } |
- |
compat_shim_.look_up2_fill_reply(reply, result_port); |
- SendReply(reply); |
+ // If the message was sent successfully, clear the result_port out of the |
+ // message so that it is not destroyed at the end of ReceiveMessage. The |
+ // above-inserted right has been moved out of the process, and destroying |
+ // the message will unref yet another right. |
+ if (SendReply(reply)) |
+ compat_shim_.look_up2_fill_reply(reply, MACH_PORT_NULL); |
} else { |
NOTREACHED(); |
} |
@@ -246,12 +249,12 @@ void LaunchdInterceptionServer::HandleSwapInteger(mach_msg_header_t* request, |
} |
} |
-void LaunchdInterceptionServer::SendReply(mach_msg_header_t* reply) { |
+bool LaunchdInterceptionServer::SendReply(mach_msg_header_t* reply) { |
kern_return_t kr = mach_msg(reply, MACH_SEND_MSG, reply->msgh_size, 0, |
MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); |
- if (kr != KERN_SUCCESS) { |
- MACH_LOG(ERROR, kr) << "Unable to send intercepted reply message."; |
- } |
+ MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr) |
+ << "Unable to send intercepted reply message."; |
+ return kr == KERN_SUCCESS; |
} |
void LaunchdInterceptionServer::ForwardMessage(mach_msg_header_t* request, |