| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "sandbox/win/src/broker_services.h" | 5 #include "sandbox/win/src/broker_services.h" |
| 6 | 6 |
| 7 #include <AclAPI.h> | 7 #include <AclAPI.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 if (1 == target_counter) { | 272 if (1 == target_counter) { |
| 273 ::ResetEvent(no_targets); | 273 ::ResetEvent(no_targets); |
| 274 } | 274 } |
| 275 break; | 275 break; |
| 276 } | 276 } |
| 277 | 277 |
| 278 case JOB_OBJECT_MSG_EXIT_PROCESS: | 278 case JOB_OBJECT_MSG_EXIT_PROCESS: |
| 279 case JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS: { | 279 case JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS: { |
| 280 { | 280 { |
| 281 AutoLock lock(&broker->lock_); | 281 AutoLock lock(&broker->lock_); |
| 282 broker->child_process_ids_.erase(reinterpret_cast<DWORD>(ovl)); | 282 broker->child_process_ids_.erase( |
| 283 static_cast<DWORD>(reinterpret_cast<uintptr_t>(ovl))); |
| 283 } | 284 } |
| 284 --target_counter; | 285 --target_counter; |
| 285 if (0 == target_counter) | 286 if (0 == target_counter) |
| 286 ::SetEvent(no_targets); | 287 ::SetEvent(no_targets); |
| 287 | 288 |
| 288 DCHECK(target_counter >= 0); | 289 DCHECK(target_counter >= 0); |
| 289 break; | 290 break; |
| 290 } | 291 } |
| 291 | 292 |
| 292 case JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT: { | 293 case JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT: { |
| 293 break; | 294 break; |
| 294 } | 295 } |
| 295 | 296 |
| 296 case JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT: { | 297 case JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT: { |
| 297 BOOL res = ::TerminateJobObject(tracker->job, | 298 BOOL res = ::TerminateJobObject(tracker->job, |
| 298 SBOX_FATAL_MEMORY_EXCEEDED); | 299 SBOX_FATAL_MEMORY_EXCEEDED); |
| 299 DCHECK(res); | 300 DCHECK(res); |
| 300 break; | 301 break; |
| 301 } | 302 } |
| 302 | 303 |
| 303 default: { | 304 default: { |
| 304 NOTREACHED(); | 305 NOTREACHED(); |
| 305 break; | 306 break; |
| 306 } | 307 } |
| 307 } | 308 } |
| 308 } else if (THREAD_CTRL_REMOVE_PEER == key) { | 309 } else if (THREAD_CTRL_REMOVE_PEER == key) { |
| 309 // Remove a process from our list of peers. | 310 // Remove a process from our list of peers. |
| 310 AutoLock lock(&broker->lock_); | 311 AutoLock lock(&broker->lock_); |
| 311 PeerTrackerMap::iterator it = | 312 PeerTrackerMap::iterator it = broker->peer_map_.find( |
| 312 broker->peer_map_.find(reinterpret_cast<DWORD>(ovl)); | 313 static_cast<DWORD>(reinterpret_cast<uintptr_t>(ovl))); |
| 313 DeregisterPeerTracker(it->second); | 314 DeregisterPeerTracker(it->second); |
| 314 broker->peer_map_.erase(it); | 315 broker->peer_map_.erase(it); |
| 315 } else if (THREAD_CTRL_QUIT == key) { | 316 } else if (THREAD_CTRL_QUIT == key) { |
| 316 // The broker object is being destroyed so the thread needs to exit. | 317 // The broker object is being destroyed so the thread needs to exit. |
| 317 return 0; | 318 return 0; |
| 318 } else { | 319 } else { |
| 319 // We have not implemented more commands. | 320 // We have not implemented more commands. |
| 320 NOTREACHED(); | 321 NOTREACHED(); |
| 321 } | 322 } |
| 322 } | 323 } |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 | 536 |
| 536 bool BrokerServicesBase::IsActiveTarget(DWORD process_id) { | 537 bool BrokerServicesBase::IsActiveTarget(DWORD process_id) { |
| 537 AutoLock lock(&lock_); | 538 AutoLock lock(&lock_); |
| 538 return child_process_ids_.find(process_id) != child_process_ids_.end() || | 539 return child_process_ids_.find(process_id) != child_process_ids_.end() || |
| 539 peer_map_.find(process_id) != peer_map_.end(); | 540 peer_map_.find(process_id) != peer_map_.end(); |
| 540 } | 541 } |
| 541 | 542 |
| 542 VOID CALLBACK BrokerServicesBase::RemovePeer(PVOID parameter, BOOLEAN timeout) { | 543 VOID CALLBACK BrokerServicesBase::RemovePeer(PVOID parameter, BOOLEAN timeout) { |
| 543 PeerTracker* peer = reinterpret_cast<PeerTracker*>(parameter); | 544 PeerTracker* peer = reinterpret_cast<PeerTracker*>(parameter); |
| 544 // Don't check the return code because we this may fail (safely) at shutdown. | 545 // Don't check the return code because we this may fail (safely) at shutdown. |
| 545 ::PostQueuedCompletionStatus(peer->job_port, 0, THREAD_CTRL_REMOVE_PEER, | 546 ::PostQueuedCompletionStatus( |
| 546 reinterpret_cast<LPOVERLAPPED>(peer->id)); | 547 peer->job_port, 0, THREAD_CTRL_REMOVE_PEER, |
| 548 reinterpret_cast<LPOVERLAPPED>(static_cast<uintptr_t>(peer->id))); |
| 547 } | 549 } |
| 548 | 550 |
| 549 ResultCode BrokerServicesBase::AddTargetPeer(HANDLE peer_process) { | 551 ResultCode BrokerServicesBase::AddTargetPeer(HANDLE peer_process) { |
| 550 scoped_ptr<PeerTracker> peer(new PeerTracker(::GetProcessId(peer_process), | 552 scoped_ptr<PeerTracker> peer(new PeerTracker(::GetProcessId(peer_process), |
| 551 job_port_)); | 553 job_port_)); |
| 552 if (!peer->id) | 554 if (!peer->id) |
| 553 return SBOX_ERROR_GENERIC; | 555 return SBOX_ERROR_GENERIC; |
| 554 | 556 |
| 555 HANDLE process_handle; | 557 HANDLE process_handle; |
| 556 if (!::DuplicateHandle(::GetCurrentProcess(), peer_process, | 558 if (!::DuplicateHandle(::GetCurrentProcess(), peer_process, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 return SBOX_ERROR_UNSUPPORTED; | 598 return SBOX_ERROR_UNSUPPORTED; |
| 597 | 599 |
| 598 base::string16 name = LookupAppContainer(sid); | 600 base::string16 name = LookupAppContainer(sid); |
| 599 if (name.empty()) | 601 if (name.empty()) |
| 600 return SBOX_ERROR_INVALID_APP_CONTAINER; | 602 return SBOX_ERROR_INVALID_APP_CONTAINER; |
| 601 | 603 |
| 602 return DeleteAppContainer(sid); | 604 return DeleteAppContainer(sid); |
| 603 } | 605 } |
| 604 | 606 |
| 605 } // namespace sandbox | 607 } // namespace sandbox |
| OLD | NEW |