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

Unified Diff: sandbox/win/src/process_thread_interception.cc

Issue 1337223002: Fixes to possible GetLastError bugs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: sandbox/win/src/process_thread_interception.cc
diff --git a/sandbox/win/src/process_thread_interception.cc b/sandbox/win/src/process_thread_interception.cc
index e6c8c2e9180c91b96164791b67de1081998b2be4..e8e7b353e3f9561099eb18c48e9eae8736785193 100644
--- a/sandbox/win/src/process_thread_interception.cc
+++ b/sandbox/win/src/process_thread_interception.cc
@@ -275,45 +275,44 @@ BOOL WINAPI TargetCreateProcessW(CreateProcessWFunction orig_CreateProcessW,
return TRUE;
}
- // We don't trust that the IPC can work this early.
- if (!SandboxFactory::GetTargetServices()->GetState()->InitCalled())
- return FALSE;
-
DWORD original_error = ::GetLastError();
- do {
- if (!ValidParameter(process_information, sizeof(PROCESS_INFORMATION),
- WRITE))
- break;
+ // We don't trust that the IPC can work this early.
+ if (SandboxFactory::GetTargetServices()->GetState()->InitCalled()) {
brucedawson 2015/09/12 00:33:55 Moving this below the initialization of original_e
cpu_(ooo_6.6-7.5) 2015/09/14 17:17:16 In this particular case it is harmless to move it
brucedawson 2015/09/14 18:59:55 Got it. How about a comment to make the rational
+ do {
+ if (!ValidParameter(process_information, sizeof(PROCESS_INFORMATION),
+ WRITE))
+ break;
- void* memory = GetGlobalIPCMemory();
- if (NULL == memory)
- break;
+ void* memory = GetGlobalIPCMemory();
+ if (NULL == memory)
+ break;
- const wchar_t* cur_dir = NULL;
+ const wchar_t* cur_dir = NULL;
- wchar_t current_directory[MAX_PATH];
- DWORD result = ::GetCurrentDirectory(MAX_PATH, current_directory);
- if (0 != result && result < MAX_PATH)
- cur_dir = current_directory;
+ wchar_t current_directory[MAX_PATH];
+ DWORD result = ::GetCurrentDirectory(MAX_PATH, current_directory);
+ if (0 != result && result < MAX_PATH)
+ cur_dir = current_directory;
- SharedMemIPCClient ipc(memory);
- CrossCallReturn answer = {0};
+ SharedMemIPCClient ipc(memory);
+ CrossCallReturn answer = {0};
- InOutCountedBuffer proc_info(process_information,
- sizeof(PROCESS_INFORMATION));
+ InOutCountedBuffer proc_info(process_information,
+ sizeof(PROCESS_INFORMATION));
- ResultCode code = CrossCall(ipc, IPC_CREATEPROCESSW_TAG, application_name,
- command_line, cur_dir, proc_info, &answer);
- if (SBOX_ALL_OK != code)
- break;
+ ResultCode code = CrossCall(ipc, IPC_CREATEPROCESSW_TAG, application_name,
+ command_line, cur_dir, proc_info, &answer);
+ if (SBOX_ALL_OK != code)
+ break;
- ::SetLastError(answer.win32_result);
- if (ERROR_SUCCESS != answer.win32_result)
- return FALSE;
+ ::SetLastError(answer.win32_result);
+ if (ERROR_SUCCESS != answer.win32_result)
+ return FALSE;
- return TRUE;
- } while (false);
+ return TRUE;
+ } while (false);
+ }
::SetLastError(original_error);
return FALSE;
@@ -334,68 +333,67 @@ BOOL WINAPI TargetCreateProcessA(CreateProcessAFunction orig_CreateProcessA,
return TRUE;
}
- // We don't trust that the IPC can work this early.
- if (!SandboxFactory::GetTargetServices()->GetState()->InitCalled())
- return FALSE;
-
DWORD original_error = ::GetLastError();
- do {
- if (!ValidParameter(process_information, sizeof(PROCESS_INFORMATION),
- WRITE))
- break;
-
- void* memory = GetGlobalIPCMemory();
- if (NULL == memory)
- break;
-
- // Convert the input params to unicode.
- UNICODE_STRING *cmd_unicode = NULL;
- UNICODE_STRING *app_unicode = NULL;
- if (command_line) {
- cmd_unicode = AnsiToUnicode(command_line);
- if (!cmd_unicode)
+ // We don't trust that the IPC can work this early.
+ if (SandboxFactory::GetTargetServices()->GetState()->InitCalled()) {
+ do {
+ if (!ValidParameter(process_information, sizeof(PROCESS_INFORMATION),
+ WRITE))
break;
- }
- if (application_name) {
- app_unicode = AnsiToUnicode(application_name);
- if (!app_unicode) {
- operator delete(cmd_unicode, NT_ALLOC);
+ void* memory = GetGlobalIPCMemory();
+ if (NULL == memory)
break;
+
+ // Convert the input params to unicode.
+ UNICODE_STRING *cmd_unicode = NULL;
+ UNICODE_STRING *app_unicode = NULL;
+ if (command_line) {
+ cmd_unicode = AnsiToUnicode(command_line);
+ if (!cmd_unicode)
+ break;
}
- }
- const wchar_t* cmd_line = cmd_unicode ? cmd_unicode->Buffer : NULL;
- const wchar_t* app_name = app_unicode ? app_unicode->Buffer : NULL;
- const wchar_t* cur_dir = NULL;
+ if (application_name) {
+ app_unicode = AnsiToUnicode(application_name);
+ if (!app_unicode) {
+ operator delete(cmd_unicode, NT_ALLOC);
+ break;
+ }
+ }
- wchar_t current_directory[MAX_PATH];
- DWORD result = ::GetCurrentDirectory(MAX_PATH, current_directory);
- if (0 != result && result < MAX_PATH)
- cur_dir = current_directory;
+ const wchar_t* cmd_line = cmd_unicode ? cmd_unicode->Buffer : NULL;
+ const wchar_t* app_name = app_unicode ? app_unicode->Buffer : NULL;
+ const wchar_t* cur_dir = NULL;
- SharedMemIPCClient ipc(memory);
- CrossCallReturn answer = {0};
+ wchar_t current_directory[MAX_PATH];
+ DWORD result = ::GetCurrentDirectory(MAX_PATH, current_directory);
+ if (0 != result && result < MAX_PATH)
+ cur_dir = current_directory;
- InOutCountedBuffer proc_info(process_information,
- sizeof(PROCESS_INFORMATION));
+ SharedMemIPCClient ipc(memory);
+ CrossCallReturn answer = {0};
- ResultCode code = CrossCall(ipc, IPC_CREATEPROCESSW_TAG, app_name,
- cmd_line, cur_dir, proc_info, &answer);
+ InOutCountedBuffer proc_info(process_information,
+ sizeof(PROCESS_INFORMATION));
- operator delete(cmd_unicode, NT_ALLOC);
- operator delete(app_unicode, NT_ALLOC);
+ ResultCode code = CrossCall(ipc, IPC_CREATEPROCESSW_TAG, app_name,
+ cmd_line, cur_dir, proc_info, &answer);
- if (SBOX_ALL_OK != code)
- break;
+ operator delete(cmd_unicode, NT_ALLOC);
+ operator delete(app_unicode, NT_ALLOC);
- ::SetLastError(answer.win32_result);
- if (ERROR_SUCCESS != answer.win32_result)
- return FALSE;
+ if (SBOX_ALL_OK != code)
+ break;
- return TRUE;
- } while (false);
+ ::SetLastError(answer.win32_result);
+ if (ERROR_SUCCESS != answer.win32_result)
+ return FALSE;
+
+ return TRUE;
+ } while (false);
+ }
::SetLastError(original_error);
return FALSE;

Powered by Google App Engine
This is Rietveld 408576698