@ -124,14 +124,15 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
< < Win32ErrorMessage ( GetLastError ( ) ) ;
}
// CreateProcess() mutates its second parameter. WTF?
char * name_copy = portable_strdup ( program . c_str ( ) ) ;
// Invoking cmd.exe allows for '.bat' files from the path as well as '.exe'.
// Using a malloc'ed string because CreateProcess() can mutate its second parameter. (WTF).
char * command_line = portable_strdup ( ( " cmd.exe /c \" " + program + " \" " ) . c_str ( ) ) ;
// Create the process.
PROCESS_INFORMATION process_info ;
if ( CreateProcessA ( ( search_mode = = SEARCH_PATH ) ? NULL : program . c_str ( ) ,
( search_mode = = SEARCH_PATH ) ? name_copy : NULL ,
( search_mode = = SEARCH_PATH ) ? command_line : NULL ,
NULL , // process security attributes
NULL , // thread security attributes
TRUE , // inherit handles?
@ -152,7 +153,7 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
CloseHandleOrDie ( stdin_pipe_read ) ;
CloseHandleOrDie ( stdout_pipe_write ) ;
free ( name_copy ) ;
free ( command_line ) ;
}
bool Subprocess : : Communicate ( const Message & input , Message * output ,