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 <Aclapi.h> | 5 #include <Aclapi.h> |
6 #include <windows.h> | 6 #include <windows.h> |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "sandbox/win/tests/validation_tests/commands.h" | 9 #include "sandbox/win/tests/validation_tests/commands.h" |
10 | 10 |
11 #include "sandbox/win/tests/common/controller.h" | 11 #include "sandbox/win/tests/common/controller.h" |
12 | 12 |
13 namespace { | 13 namespace { |
14 | 14 |
15 // Returns the HKEY corresponding to name. If there is no HKEY corresponding | 15 // Returns the HKEY corresponding to name. If there is no HKEY corresponding |
16 // to the name it returns NULL. | 16 // to the name it returns NULL. |
17 HKEY GetHKEYFromString(const base::string16 &name) { | 17 HKEY GetHKEYFromString(const base::string16 &name) { |
18 if (L"HKLM" == name) | 18 if (name == L"HKLM") |
Peter Kasting
2014/09/29 23:09:26
Chromium style: Do (var == const), not (const == v
cpu_(ooo_6.6-7.5)
2014/09/30 17:57:27
Acknowledged.
| |
19 return HKEY_LOCAL_MACHINE; | 19 return HKEY_LOCAL_MACHINE; |
20 else if (L"HKCR" == name) | 20 if (name == L"HKCR") |
Peter Kasting
2014/09/29 23:09:26
Chromium style: No else after return
cpu_(ooo_6.6-7.5)
2014/09/30 17:57:26
Acknowledged.
| |
21 return HKEY_CLASSES_ROOT; | 21 return HKEY_CLASSES_ROOT; |
22 else if (L"HKCC" == name) | 22 if (name == L"HKCC") |
23 return HKEY_CURRENT_CONFIG; | 23 return HKEY_CURRENT_CONFIG; |
24 else if (L"HKCU" == name) | 24 if (name == L"HKCU") |
25 return HKEY_CURRENT_USER; | 25 return HKEY_CURRENT_USER; |
26 else if (L"HKU" == name) | 26 if (name == L"HKU") |
27 return HKEY_USERS; | 27 return HKEY_USERS; |
28 | 28 |
29 return NULL; | 29 return NULL; |
30 } | 30 } |
31 | 31 |
32 // Modifies string to remove the leading and trailing quotes. | 32 // Modifies string to remove the leading and trailing quotes. |
33 void trim_quote(base::string16* string) { | 33 void trim_quote(base::string16* string) { |
34 base::string16::size_type pos1 = string->find_first_not_of(L'"'); | 34 base::string16::size_type pos1 = string->find_first_not_of(L'"'); |
35 base::string16::size_type pos2 = string->find_last_not_of(L'"'); | 35 base::string16::size_type pos2 = string->find_last_not_of(L'"'); |
36 | 36 |
37 if (base::string16::npos == pos1 || base::string16::npos == pos2) | 37 if (pos1 == base::string16::npos || pos2 == base::string16::npos) |
38 (*string) = L""; | 38 string->clear(); |
39 else | 39 else |
40 (*string) = string->substr(pos1, pos2 + 1); | 40 (*string) = string->substr(pos1, pos2 + 1); |
41 } | 41 } |
42 | 42 |
43 int TestOpenFile(base::string16 path, bool for_write) { | 43 int TestOpenFile(base::string16 path, bool for_write) { |
44 wchar_t path_expanded[MAX_PATH + 1] = {0}; | 44 wchar_t path_expanded[MAX_PATH + 1] = {0}; |
45 DWORD size = ::ExpandEnvironmentStrings(path.c_str(), path_expanded, | 45 DWORD size = ::ExpandEnvironmentStrings(path.c_str(), path_expanded, |
46 MAX_PATH); | 46 MAX_PATH); |
47 if (!size) | 47 if (!size) |
48 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 48 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
49 | 49 |
50 HANDLE file; | 50 HANDLE file; |
51 file = ::CreateFile(path_expanded, | 51 file = ::CreateFile(path_expanded, |
52 for_write ? GENERIC_READ | GENERIC_WRITE : GENERIC_READ, | 52 for_write ? GENERIC_READ | GENERIC_WRITE : GENERIC_READ, |
53 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, | 53 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
54 NULL, // No security attributes. | 54 NULL, // No security attributes. |
55 OPEN_EXISTING, | 55 OPEN_EXISTING, |
56 FILE_FLAG_BACKUP_SEMANTICS, | 56 FILE_FLAG_BACKUP_SEMANTICS, |
57 NULL); // No template. | 57 NULL); // No template. |
58 | 58 |
59 if (INVALID_HANDLE_VALUE != file) { | 59 if (file != INVALID_HANDLE_VALUE) { |
60 ::CloseHandle(file); | 60 ::CloseHandle(file); |
61 return sandbox::SBOX_TEST_SUCCEEDED; | 61 return sandbox::SBOX_TEST_SUCCEEDED; |
62 } else { | |
63 if (ERROR_ACCESS_DENIED == ::GetLastError()) { | |
64 return sandbox::SBOX_TEST_DENIED; | |
65 } else { | |
66 return sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
67 } | |
68 } | 62 } |
63 return (::GetLastError() == ERROR_ACCESS_DENIED) ? | |
64 sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
69 } | 65 } |
70 | 66 |
71 } // namespace | 67 } // namespace |
72 | 68 |
73 namespace sandbox { | 69 namespace sandbox { |
74 | 70 |
75 SBOX_TESTS_COMMAND int ValidWindow(int argc, wchar_t **argv) { | 71 SBOX_TESTS_COMMAND int ValidWindow(int argc, wchar_t **argv) { |
76 if (1 != argc) | 72 return (argc == 1) ? |
77 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 73 TestValidWindow( |
78 | 74 reinterpret_cast<HWND>(static_cast<ULONG_PTR>(_wtoi(argv[0])))) : |
79 HWND window = reinterpret_cast<HWND>(static_cast<ULONG_PTR>(_wtoi(argv[0]))); | 75 SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
80 | |
81 return TestValidWindow(window); | |
82 } | 76 } |
83 | 77 |
84 int TestValidWindow(HWND window) { | 78 int TestValidWindow(HWND window) { |
85 if (::IsWindow(window)) | 79 return ::IsWindow(window) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
86 return SBOX_TEST_SUCCEEDED; | |
87 | |
88 return SBOX_TEST_DENIED; | |
89 } | 80 } |
90 | 81 |
91 SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) { | 82 SBOX_TESTS_COMMAND int OpenProcessCmd(int argc, wchar_t **argv) { |
92 if (2 != argc) | 83 return (argc == 2) ? |
93 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 84 TestOpenProcess(_wtol(argv[0]), _wtol(argv[1])) : |
94 | 85 SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
95 DWORD process_id = _wtol(argv[0]); | |
96 DWORD access_mask = _wtol(argv[1]); | |
97 return TestOpenProcess(process_id, access_mask); | |
98 } | 86 } |
99 | 87 |
100 int TestOpenProcess(DWORD process_id, DWORD access_mask) { | 88 int TestOpenProcess(DWORD process_id, DWORD access_mask) { |
101 HANDLE process = ::OpenProcess(access_mask, | 89 HANDLE process = ::OpenProcess(access_mask, |
102 FALSE, // Do not inherit handle. | 90 FALSE, // Do not inherit handle. |
103 process_id); | 91 process_id); |
104 if (NULL == process) { | 92 if (process != NULL) { |
105 if (ERROR_ACCESS_DENIED == ::GetLastError()) { | |
106 return SBOX_TEST_DENIED; | |
107 } else { | |
108 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
109 } | |
110 } else { | |
111 ::CloseHandle(process); | 93 ::CloseHandle(process); |
112 return SBOX_TEST_SUCCEEDED; | 94 return SBOX_TEST_SUCCEEDED; |
113 } | 95 } |
96 return (::GetLastError() == ERROR_ACCESS_DENIED) ? | |
97 sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
114 } | 98 } |
115 | 99 |
116 SBOX_TESTS_COMMAND int OpenThreadCmd(int argc, wchar_t **argv) { | 100 SBOX_TESTS_COMMAND int OpenThreadCmd(int argc, wchar_t **argv) { |
117 if (1 != argc) | 101 return (argc == 1) ? |
118 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 102 TestOpenThread(_wtoi(argv[0])) : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
119 | |
120 DWORD thread_id = _wtoi(argv[0]); | |
121 return TestOpenThread(thread_id); | |
122 } | 103 } |
123 | 104 |
124 int TestOpenThread(DWORD thread_id) { | 105 int TestOpenThread(DWORD thread_id) { |
125 | |
126 HANDLE thread = ::OpenThread(THREAD_QUERY_INFORMATION, | 106 HANDLE thread = ::OpenThread(THREAD_QUERY_INFORMATION, |
127 FALSE, // Do not inherit handles. | 107 FALSE, // Do not inherit handles. |
128 thread_id); | 108 thread_id); |
129 | 109 if (thread != NULL) { |
130 if (NULL == thread) { | |
131 if (ERROR_ACCESS_DENIED == ::GetLastError()) { | |
132 return SBOX_TEST_DENIED; | |
133 } else { | |
134 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
135 } | |
136 } else { | |
137 ::CloseHandle(thread); | 110 ::CloseHandle(thread); |
138 return SBOX_TEST_SUCCEEDED; | 111 return SBOX_TEST_SUCCEEDED; |
139 } | 112 } |
113 return (::GetLastError() == ERROR_ACCESS_DENIED) ? | |
114 sandbox::SBOX_TEST_DENIED : sandbox::SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
140 } | 115 } |
141 | 116 |
142 SBOX_TESTS_COMMAND int OpenFileCmd(int argc, wchar_t **argv) { | 117 SBOX_TESTS_COMMAND int OpenFileCmd(int argc, wchar_t **argv) { |
143 if (1 != argc) | 118 if (1 != argc) |
144 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 119 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
145 | 120 |
146 base::string16 path = argv[0]; | 121 base::string16 path = argv[0]; |
147 trim_quote(&path); | 122 trim_quote(&path); |
148 | 123 |
149 return TestOpenReadFile(path); | 124 return TestOpenReadFile(path); |
150 } | 125 } |
151 | 126 |
152 int TestOpenReadFile(const base::string16& path) { | 127 int TestOpenReadFile(const base::string16& path) { |
153 return TestOpenFile(path, false); | 128 return TestOpenFile(path, false); |
154 } | 129 } |
155 | 130 |
156 int TestOpenWriteFile(int argc, wchar_t **argv) { | 131 int TestOpenWriteFile(int argc, wchar_t **argv) { |
157 if (1 != argc) | 132 if (argc != 1) |
158 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 133 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
159 | 134 |
160 base::string16 path = argv[0]; | 135 base::string16 path = argv[0]; |
161 trim_quote(&path); | 136 trim_quote(&path); |
162 | |
163 return TestOpenWriteFile(path); | 137 return TestOpenWriteFile(path); |
164 } | 138 } |
165 | 139 |
166 int TestOpenWriteFile(const base::string16& path) { | 140 int TestOpenWriteFile(const base::string16& path) { |
167 return TestOpenFile(path, true); | 141 return TestOpenFile(path, true); |
168 } | 142 } |
169 | 143 |
170 SBOX_TESTS_COMMAND int OpenKey(int argc, wchar_t **argv) { | 144 SBOX_TESTS_COMMAND int OpenKey(int argc, wchar_t **argv) { |
171 if (0 == argc || argc > 2) | 145 if (argc != 1 && argc != 2) |
172 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 146 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
173 | 147 |
174 // Get the hive. | 148 // Get the hive. |
175 HKEY base_key = GetHKEYFromString(argv[0]); | 149 HKEY base_key = GetHKEYFromString(argv[0]); |
176 | 150 |
177 // Get the subkey. | 151 // Get the subkey. |
178 base::string16 subkey; | 152 base::string16 subkey; |
179 if (2 == argc) { | 153 if (argc == 2) { |
180 subkey = argv[1]; | 154 subkey = argv[1]; |
181 trim_quote(&subkey); | 155 trim_quote(&subkey); |
182 } | 156 } |
183 | 157 |
184 return TestOpenKey(base_key, subkey); | 158 return TestOpenKey(base_key, subkey); |
185 } | 159 } |
186 | 160 |
187 int TestOpenKey(HKEY base_key, base::string16 subkey) { | 161 int TestOpenKey(HKEY base_key, base::string16 subkey) { |
188 HKEY key; | 162 HKEY key; |
189 LONG err_code = ::RegOpenKeyEx(base_key, | 163 LONG err_code = ::RegOpenKeyEx(base_key, |
190 subkey.c_str(), | 164 subkey.c_str(), |
191 0, // Reserved, must be 0. | 165 0, // Reserved, must be 0. |
192 MAXIMUM_ALLOWED, | 166 MAXIMUM_ALLOWED, |
193 &key); | 167 &key); |
194 if (ERROR_SUCCESS == err_code) { | 168 if (err_code == ERROR_SUCCESS) { |
195 ::RegCloseKey(key); | 169 ::RegCloseKey(key); |
196 return SBOX_TEST_SUCCEEDED; | 170 return SBOX_TEST_SUCCEEDED; |
197 } else if (ERROR_INVALID_HANDLE == err_code || | |
198 ERROR_ACCESS_DENIED == err_code) { | |
199 return SBOX_TEST_DENIED; | |
200 } else { | |
201 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
202 } | 171 } |
172 return (err_code == ERROR_INVALID_HANDLE || err_code == ERROR_ACCESS_DENIED) ? | |
173 SBOX_TEST_DENIED : SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | |
203 } | 174 } |
204 | 175 |
205 // Returns true if the current's thread desktop is the interactive desktop. | 176 // Returns true if the current's thread desktop is the interactive desktop. |
206 // In Vista there is a more direct test but for XP and w2k we need to check | 177 // In Vista there is a more direct test but for XP and w2k we need to check |
207 // the object name. | 178 // the object name. |
208 bool IsInteractiveDesktop(bool* is_interactive) { | 179 bool IsInteractiveDesktop(bool* is_interactive) { |
209 HDESK current_desk = ::GetThreadDesktop(::GetCurrentThreadId()); | 180 HDESK current_desk = ::GetThreadDesktop(::GetCurrentThreadId()); |
210 if (NULL == current_desk) { | 181 if (current_desk == NULL) |
Peter Kasting
2014/09/29 23:09:26
File style: Consistently avoid {} on one-line bodi
| |
211 return false; | 182 return false; |
212 } | |
213 wchar_t current_desk_name[256] = {0}; | 183 wchar_t current_desk_name[256] = {0}; |
214 if (!::GetUserObjectInformationW(current_desk, UOI_NAME, current_desk_name, | 184 if (!::GetUserObjectInformationW(current_desk, UOI_NAME, current_desk_name, |
215 sizeof(current_desk_name), NULL)) { | 185 sizeof(current_desk_name), NULL)) |
216 return false; | 186 return false; |
217 } | |
218 *is_interactive = (0 == _wcsicmp(L"default", current_desk_name)); | 187 *is_interactive = (0 == _wcsicmp(L"default", current_desk_name)); |
219 return true; | 188 return true; |
220 } | 189 } |
221 | 190 |
222 SBOX_TESTS_COMMAND int OpenInteractiveDesktop(int, wchar_t **) { | 191 SBOX_TESTS_COMMAND int OpenInteractiveDesktop(int, wchar_t **) { |
223 return TestOpenInputDesktop(); | 192 return TestOpenInputDesktop(); |
224 } | 193 } |
225 | 194 |
226 int TestOpenInputDesktop() { | 195 int TestOpenInputDesktop() { |
227 bool is_interactive = false; | 196 bool is_interactive = false; |
228 if (IsInteractiveDesktop(&is_interactive) && is_interactive) { | 197 if (IsInteractiveDesktop(&is_interactive) && is_interactive) |
229 return SBOX_TEST_SUCCEEDED; | 198 return SBOX_TEST_SUCCEEDED; |
230 } | |
231 HDESK desk = ::OpenInputDesktop(0, FALSE, DESKTOP_CREATEWINDOW); | 199 HDESK desk = ::OpenInputDesktop(0, FALSE, DESKTOP_CREATEWINDOW); |
232 if (desk) { | 200 if (desk) { |
233 ::CloseDesktop(desk); | 201 ::CloseDesktop(desk); |
234 return SBOX_TEST_SUCCEEDED; | 202 return SBOX_TEST_SUCCEEDED; |
235 } | 203 } |
236 return SBOX_TEST_DENIED; | 204 return SBOX_TEST_DENIED; |
237 } | 205 } |
238 | 206 |
239 SBOX_TESTS_COMMAND int SwitchToSboxDesktop(int, wchar_t **) { | 207 SBOX_TESTS_COMMAND int SwitchToSboxDesktop(int, wchar_t **) { |
240 return TestSwitchDesktop(); | 208 return TestSwitchDesktop(); |
241 } | 209 } |
242 | 210 |
243 int TestSwitchDesktop() { | 211 int TestSwitchDesktop() { |
244 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); | 212 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); |
245 if (NULL == desktop) { | 213 if (desktop == NULL) |
246 return SBOX_TEST_FAILED; | 214 return SBOX_TEST_FAILED; |
247 } | 215 return ::SwitchDesktop(desktop) ? SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
248 if (::SwitchDesktop(desktop)) { | |
249 return SBOX_TEST_SUCCEEDED; | |
250 } | |
251 return SBOX_TEST_DENIED; | |
252 } | 216 } |
253 | 217 |
254 SBOX_TESTS_COMMAND int OpenAlternateDesktop(int, wchar_t **argv) { | 218 SBOX_TESTS_COMMAND int OpenAlternateDesktop(int, wchar_t **argv) { |
255 return TestOpenAlternateDesktop(argv[0]); | 219 return TestOpenAlternateDesktop(argv[0]); |
256 } | 220 } |
257 | 221 |
258 int TestOpenAlternateDesktop(wchar_t *desktop_name) { | 222 int TestOpenAlternateDesktop(wchar_t *desktop_name) { |
259 // Test for WRITE_DAC permission on the handle. | 223 // Test for WRITE_DAC permission on the handle. |
260 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); | 224 HDESK desktop = ::GetThreadDesktop(::GetCurrentThreadId()); |
261 if (desktop) { | 225 if (desktop) { |
262 HANDLE test_handle; | 226 HANDLE test_handle; |
263 if (::DuplicateHandle(::GetCurrentProcess(), desktop, | 227 if (::DuplicateHandle(::GetCurrentProcess(), desktop, |
264 ::GetCurrentProcess(), &test_handle, | 228 ::GetCurrentProcess(), &test_handle, |
265 WRITE_DAC, FALSE, 0)) { | 229 WRITE_DAC, FALSE, 0)) { |
266 DWORD result = ::SetSecurityInfo(test_handle, SE_WINDOW_OBJECT, | 230 DWORD result = ::SetSecurityInfo(test_handle, SE_WINDOW_OBJECT, |
267 DACL_SECURITY_INFORMATION, NULL, NULL, | 231 DACL_SECURITY_INFORMATION, NULL, NULL, |
268 NULL, NULL); | 232 NULL, NULL); |
269 ::CloseHandle(test_handle); | 233 ::CloseHandle(test_handle); |
270 if (result == ERROR_SUCCESS) { | 234 if (result == ERROR_SUCCESS) |
271 return SBOX_TEST_SUCCEEDED; | 235 return SBOX_TEST_SUCCEEDED; |
272 } | |
273 } else if (::GetLastError() != ERROR_ACCESS_DENIED) { | 236 } else if (::GetLastError() != ERROR_ACCESS_DENIED) { |
274 return SBOX_TEST_FAILED; | 237 return SBOX_TEST_FAILED; |
275 } | 238 } |
276 } | 239 } |
277 | 240 |
278 // Open by name with WRITE_DAC. | 241 // Open by name with WRITE_DAC. |
279 desktop = ::OpenDesktop(desktop_name, 0, FALSE, WRITE_DAC); | 242 desktop = ::OpenDesktop(desktop_name, 0, FALSE, WRITE_DAC); |
280 if (desktop || ::GetLastError() != ERROR_ACCESS_DENIED) { | 243 if (!desktop && ::GetLastError() == ERROR_ACCESS_DENIED) |
281 ::CloseDesktop(desktop); | 244 return SBOX_TEST_DENIED; |
282 return SBOX_TEST_SUCCEEDED; | 245 ::CloseDesktop(desktop); |
283 } | 246 return SBOX_TEST_SUCCEEDED; |
284 | |
285 return SBOX_TEST_DENIED; | |
286 } | 247 } |
287 | 248 |
288 BOOL CALLBACK DesktopTestEnumProc(LPTSTR desktop_name, LPARAM result) { | 249 BOOL CALLBACK DesktopTestEnumProc(LPTSTR desktop_name, LPARAM result) { |
289 return TRUE; | 250 return TRUE; |
290 } | 251 } |
291 | 252 |
292 SBOX_TESTS_COMMAND int EnumAlternateWinsta(int, wchar_t **) { | 253 SBOX_TESTS_COMMAND int EnumAlternateWinsta(int, wchar_t **) { |
293 return TestEnumAlternateWinsta(); | 254 return TestEnumAlternateWinsta(); |
294 } | 255 } |
295 | 256 |
296 int TestEnumAlternateWinsta() { | 257 int TestEnumAlternateWinsta() { |
297 int result = SBOX_TEST_DENIED; | |
298 // Try to enumerate the destops on the alternate windowstation. | 258 // Try to enumerate the destops on the alternate windowstation. |
299 if (::EnumDesktopsW(NULL, DesktopTestEnumProc, 0)) { | 259 return ::EnumDesktopsW(NULL, DesktopTestEnumProc, 0) ? |
300 return SBOX_TEST_SUCCEEDED; | 260 SBOX_TEST_SUCCEEDED : SBOX_TEST_DENIED; |
301 } | |
302 return SBOX_TEST_DENIED; | |
303 } | 261 } |
304 | 262 |
305 SBOX_TESTS_COMMAND int SleepCmd(int argc, wchar_t **argv) { | 263 SBOX_TESTS_COMMAND int SleepCmd(int argc, wchar_t **argv) { |
306 if (1 != argc) | 264 if (argc != 1) |
307 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 265 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
308 | 266 |
309 ::Sleep(_wtoi(argv[0])); | 267 ::Sleep(_wtoi(argv[0])); |
310 return SBOX_TEST_SUCCEEDED; | 268 return SBOX_TEST_SUCCEEDED; |
311 } | 269 } |
312 | 270 |
313 SBOX_TESTS_COMMAND int AllocateCmd(int argc, wchar_t **argv) { | 271 SBOX_TESTS_COMMAND int AllocateCmd(int argc, wchar_t **argv) { |
314 if (argc != 1) | 272 if (argc != 1) |
315 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; | 273 return SBOX_TEST_FAILED_TO_EXECUTE_COMMAND; |
316 | 274 |
317 size_t mem_size = static_cast<size_t>(_wtoll(argv[0])); | 275 size_t mem_size = static_cast<size_t>(_wtoll(argv[0])); |
318 void* memory = ::VirtualAlloc(NULL, mem_size, MEM_COMMIT | MEM_RESERVE, | 276 void* memory = ::VirtualAlloc(NULL, mem_size, MEM_COMMIT | MEM_RESERVE, |
319 PAGE_READWRITE); | 277 PAGE_READWRITE); |
320 if (!memory) { | 278 if (!memory) { |
321 // We need to give the broker a chance to kill our process on failure. | 279 // We need to give the broker a chance to kill our process on failure. |
322 ::Sleep(5000); | 280 ::Sleep(5000); |
323 return SBOX_TEST_DENIED; | 281 return SBOX_TEST_DENIED; |
324 } | 282 } |
325 | 283 |
326 if (!::VirtualFree(memory, 0, MEM_RELEASE)) | 284 return ::VirtualFree(memory, 0, MEM_RELEASE) ? |
327 return SBOX_TEST_FAILED; | 285 SBOX_TEST_SUCCEEDED : SBOX_TEST_FAILED; |
328 | |
329 return SBOX_TEST_SUCCEEDED; | |
330 } | 286 } |
331 | 287 |
332 | 288 |
333 } // namespace sandbox | 289 } // namespace sandbox |
OLD | NEW |