| Index: runtime/bin/process_win.cc | 
| diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc | 
| index 5628a53998d36f624c6cffed0f21fde75e2cd0e0..3094176a6e0743718f150d61c77a572344939380 100644 | 
| --- a/runtime/bin/process_win.cc | 
| +++ b/runtime/bin/process_win.cc | 
| @@ -8,6 +8,7 @@ | 
| #include "bin/process.h" | 
| #include "bin/eventhandler.h" | 
| #include "bin/thread.h" | 
| +#include "bin/utils.h" | 
| #include "platform/globals.h" | 
|  | 
| static const int kReadHandle = 0; | 
| @@ -398,6 +399,12 @@ int Process::Start(const char* path, | 
| PROCESS_INFORMATION process_info; | 
| ZeroMemory(&process_info, sizeof(process_info)); | 
|  | 
| +  // Transform input strings to system format. | 
| +  path = StringUtils::Utf8ToSystemString(path); | 
| +  for (int i = 0; i < arguments_length; i++) { | 
| +     arguments[i] = StringUtils::Utf8ToSystemString(arguments[i]); | 
| +  } | 
| + | 
| // Compute command-line length. | 
| int command_line_length = strlen(path); | 
| for (int i = 0; i < arguments_length; i++) { | 
| @@ -410,6 +417,8 @@ int Process::Start(const char* path, | 
| int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); | 
| CloseProcessPipes( | 
| stdin_handles, stdout_handles, stderr_handles, exit_handles); | 
| +    free(const_cast<char*>(path)); | 
| +    for (int i = 0; i < arguments_length; i++) free(arguments[i]); | 
| return error_code; | 
| } | 
|  | 
| @@ -427,10 +436,17 @@ int Process::Start(const char* path, | 
| remaining -= written; | 
| ASSERT(remaining >= 0); | 
| } | 
| +  free(const_cast<char*>(path)); | 
| +  for (int i = 0; i < arguments_length; i++) free(arguments[i]); | 
|  | 
| // Create environment block if an environment is supplied. | 
| char* environment_block = NULL; | 
| if (environment != NULL) { | 
| +    // Convert environment strings to system strings. | 
| +    for (intptr_t i = 0; i < environment_length; i++) { | 
| +      environment[i] = StringUtils::Utf8ToSystemString(environment[i]); | 
| +    } | 
| + | 
| // An environment block is a sequence of zero-terminated strings | 
| // followed by a block-terminating zero char. | 
| intptr_t block_size = 1; | 
| @@ -452,6 +468,11 @@ int Process::Start(const char* path, | 
| // Block-terminating zero char. | 
| environment_block[block_index++] = '\0'; | 
| ASSERT(block_index == block_size); | 
| +    for (intptr_t i = 0; i < environment_length; i++) free(environment[i]); | 
| +  } | 
| + | 
| +  if (working_directory != NULL) { | 
| +    working_directory = StringUtils::Utf8ToSystemString(working_directory); | 
| } | 
|  | 
| // Create process. | 
| @@ -469,6 +490,9 @@ int Process::Start(const char* path, | 
| // Deallocate command-line and environment block strings. | 
| delete[] command_line; | 
| delete[] environment_block; | 
| +  if (working_directory != NULL) { | 
| +    free(const_cast<char*>(working_directory)); | 
| +  } | 
|  | 
| if (result == 0) { | 
| int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); | 
|  |