Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(440)

Side by Side Diff: sandbox/win/src/handle_closer_agent.cc

Issue 919893002: Replace handles that the handle closer closes with dummy Events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: only stuff events and file handles Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/handle_closer_agent.h" 5 #include "sandbox/win/src/handle_closer_agent.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "sandbox/win/src/nt_internals.h" 8 #include "sandbox/win/src/nt_internals.h"
9 #include "sandbox/win/src/win_utils.h" 9 #include "sandbox/win/src/win_utils.h"
10 10
(...skipping 12 matching lines...) Expand all
23 NTSTATUS status = STATUS_UNSUCCESSFUL; 23 NTSTATUS status = STATUS_UNSUCCESSFUL;
24 __try { 24 __try {
25 status = QueryObject(handle, ObjectTypeInformation, buffer, *size, size); 25 status = QueryObject(handle, ObjectTypeInformation, buffer, *size, size);
26 } __except(GetExceptionCode() == STATUS_INVALID_HANDLE ? 26 } __except(GetExceptionCode() == STATUS_INVALID_HANDLE ?
27 EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { 27 EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
28 status = STATUS_INVALID_HANDLE; 28 status = STATUS_INVALID_HANDLE;
29 } 29 }
30 return status; 30 return status;
31 } 31 }
32 32
33 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.
34 // Only attempt to stuff Files and Events at the moment.
35 if (type != L"Event" &&
36 type != L"File") {
37 return true;
38 }
39
40 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
41
42 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.
43 return false;
44
45 std::vector<HANDLE> to_close;
46 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.
47
48 while (reinterpret_cast<uintptr_t>(dummy) <
49 reinterpret_cast<uintptr_t>(to_stuff)) {
50 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.
51 to_close.push_back(dummy);
52
53 if (!::DuplicateHandle(::GetCurrentProcess(), dummy, ::GetCurrentProcess(),
54 &dup_dummy, 0, false, options))
55 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
56 dummy = dup_dummy;
57 }
58
59 if (dummy != to_stuff)
60 to_close.push_back(dummy);
61
62 for (auto h : to_close)
63 ::CloseHandle(h);
64
65 // We want to know when we're not able to stuff handles.
66 DCHECK(dummy == to_stuff);
67
68 return dummy == to_stuff;
69 }
70
33 } // namespace 71 } // namespace
34 72
35 namespace sandbox { 73 namespace sandbox {
36 74
37 // Memory buffer mapped from the parent, with the list of handles. 75 // Memory buffer mapped from the parent, with the list of handles.
38 SANDBOX_INTERCEPT HandleCloserInfo* g_handles_to_close = NULL; 76 SANDBOX_INTERCEPT HandleCloserInfo* g_handles_to_close = NULL;
39 77
40 bool HandleCloserAgent::NeedsHandlesClosed() { 78 bool HandleCloserAgent::NeedsHandlesClosed() {
41 return g_handles_to_close != NULL; 79 return g_handles_to_close != NULL;
42 } 80 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 if (!names.empty()) { 167 if (!names.empty()) {
130 // Move on to the next handle if this name doesn't match. 168 // Move on to the next handle if this name doesn't match.
131 if (!GetHandleName(handle, &handle_name) || !names.count(handle_name)) 169 if (!GetHandleName(handle, &handle_name) || !names.count(handle_name))
132 continue; 170 continue;
133 } 171 }
134 172
135 if (!::SetHandleInformation(handle, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0)) 173 if (!::SetHandleInformation(handle, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0))
136 return false; 174 return false;
137 if (!::CloseHandle(handle)) 175 if (!::CloseHandle(handle))
138 return false; 176 return false;
177 // 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.
178 AttemptToStuffHandleSlot(handle, result->first);
139 } 179 }
140 } 180 }
141 181
142 return true; 182 return true;
143 } 183 }
144 184
145 } // namespace sandbox 185 } // namespace sandbox
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698