Chromium Code Reviews| Index: sandbox/src/broker_services.cc |
| =================================================================== |
| --- sandbox/src/broker_services.cc (revision 131361) |
| +++ sandbox/src/broker_services.cc (working copy) |
| @@ -315,4 +315,41 @@ |
| return child_process_ids_.find(process_id) != child_process_ids_.end(); |
| } |
| +VOID CALLBACK BrokerServicesBase::RemovePeer(PVOID process, BOOLEAN) { |
| + DWORD process_id = ::GetProcessId(process); |
| + BrokerServicesBase* broker = BrokerServicesBase::GetInstance(); |
| + |
| + AutoLock lock(&broker->lock_); |
| + broker->child_process_ids_.erase(process_id); |
| + CloseHandle(process); |
| +} |
| + |
| +ResultCode BrokerServicesBase::AddTargetPeer(HANDLE peer_process) { |
| + DWORD peer_id = ::GetProcessId(peer_process); |
| + base::win::ScopedHandle peer_handle; |
| + if (!peer_id || !::DuplicateHandle(::GetCurrentProcess(), peer_process, |
| + ::GetCurrentProcess(), |
| + peer_handle.Receive(), |
| + SYNCHRONIZE | PROCESS_QUERY_INFORMATION, |
| + FALSE, 0)) { |
|
cpu_(ooo_6.6-7.5)
2012/04/09 23:17:40
UnregisterWaitEx with some magic params.
jschuh
2012/04/10 00:10:11
Done.
|
| + return SBOX_ERROR_GENERIC; |
| + } |
| + |
| + HANDLE timer; |
|
cpu_(ooo_6.6-7.5)
2012/04/09 23:17:40
wait_object
jschuh
2012/04/10 00:10:11
Done.
|
| + AutoLock lock(&lock_); |
| + if (!::RegisterWaitForSingleObject(&timer, peer_handle, RemovePeer, |
| + peer_handle, INFINITE, |
| + WT_EXECUTEONLYONCE)) { |
| + return SBOX_ERROR_GENERIC; |
| + } |
| + if (!child_process_ids_.insert(peer_id).second) { |
| + ::CancelWaitableTimer(timer); |
|
cpu_(ooo_6.6-7.5)
2012/04/09 23:17:40
UnregisterWait
jschuh
2012/04/10 00:10:11
Done.
|
| + return SBOX_ERROR_BAD_PARAMS; |
| + } |
| + |
| + // Leak the handle because it gets closed by the callback. |
| + peer_handle.Take(); |
| + return SBOX_ALL_OK; |
| +} |
| + |
| } // namespace sandbox |