Chromium Code Reviews| Index: sandbox/win/src/handle_closer_agent.cc |
| diff --git a/sandbox/win/src/handle_closer_agent.cc b/sandbox/win/src/handle_closer_agent.cc |
| index 07c6a09854d2d5355a84f30f782ec57f1a04f3ab..26f0a73e03c87b6f005d62e655861837fa3df9ae 100644 |
| --- a/sandbox/win/src/handle_closer_agent.cc |
| +++ b/sandbox/win/src/handle_closer_agent.cc |
| @@ -30,6 +30,44 @@ NTSTATUS QueryObjectTypeInformation(HANDLE handle, |
| return status; |
| } |
| +bool AttemptToStuffHandleSlot(HANDLE to_stuff, const base::string16& type) { |
|
cpu_(ooo_6.6-7.5)
2015/02/18 18:00:00
to_stuff -> closed_handle ?
Will Harris
2015/02/18 22:11:28
Done.
|
| + // Only attempt to stuff Files and Events at the moment. |
| + if (type != L"Event" && |
| + type != L"File") { |
| + return true; |
| + } |
| + |
| + HANDLE dummy = ::CreateEvent(NULL, FALSE, FALSE, NULL); |
|
forshaw
2015/02/18 10:50:10
Can we just use one event object for all stuffed h
cpu_(ooo_6.6-7.5)
2015/02/18 18:00:00
given that is single threaded we can indeed use a
Will Harris
2015/02/18 22:11:29
we can't create the template handle static in this
|
| + |
| + if (dummy == INVALID_HANDLE_VALUE) |
|
forshaw
2015/02/18 10:50:10
While unlikely to fail CreateEvent actually return
Will Harris
2015/02/18 22:11:29
Done.
|
| + return false; |
| + |
| + std::vector<HANDLE> to_close; |
| + DWORD options = DUPLICATE_SAME_ACCESS; |
|
Sigurður Ásgeirsson
2015/02/18 13:56:00
looks pretty reasonable - you may want to document
Will Harris
2015/02/18 22:11:29
changed this to 0 access as per other comments.
|
| + |
| + while (reinterpret_cast<uintptr_t>(dummy) < |
| + reinterpret_cast<uintptr_t>(to_stuff)) { |
| + HANDLE dup_dummy; |
|
cpu_(ooo_6.6-7.5)
2015/02/18 18:00:00
move dup_dummy below 51
Will Harris
2015/02/18 22:11:29
Acknowledged.
|
| + to_close.push_back(dummy); |
| + |
| + if (!::DuplicateHandle(::GetCurrentProcess(), dummy, ::GetCurrentProcess(), |
| + &dup_dummy, 0, false, options)) |
| + break; |
|
Sigurður Ásgeirsson
2015/02/18 19:02:47
come to think of it, another check you may want to
Will Harris
2015/02/18 22:11:28
We can't do this because we don't know if the hand
|
| + dummy = dup_dummy; |
| + } |
| + |
| + if (dummy != to_stuff) |
| + to_close.push_back(dummy); |
| + |
| + for (auto h : to_close) |
| + ::CloseHandle(h); |
| + |
| + // We want to know when we're not able to stuff handles. |
| + DCHECK(dummy == to_stuff); |
| + |
| + return dummy == to_stuff; |
| +} |
| + |
| } // namespace |
| namespace sandbox { |
| @@ -136,6 +174,8 @@ bool HandleCloserAgent::CloseHandles() { |
| return false; |
| if (!::CloseHandle(handle)) |
| return false; |
| + // Attempt to stuff this handle with a new empty Event. |
|
cpu_(ooo_6.6-7.5)
2015/02/18 18:00:00
"new dummy event"
Will Harris
2015/02/18 22:11:29
Done.
|
| + AttemptToStuffHandleSlot(handle, result->first); |
| } |
| } |