From 4e5ae963e855fb201aa70f2784a62c70ca3c6580 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Mon, 3 Sep 2018 12:09:16 +0000 Subject: [PATCH] On Windows invoke plugins using cmd.exe This will find .bat files as well as .exe. Only affects the case when plugins are invoked from PATH. This does not change behaviour when compiled under Cygwin.. --- src/google/protobuf/compiler/subprocess.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/google/protobuf/compiler/subprocess.cc b/src/google/protobuf/compiler/subprocess.cc index 2e5a89ac49..5bd3d43529 100644 --- a/src/google/protobuf/compiler/subprocess.cc +++ b/src/google/protobuf/compiler/subprocess.cc @@ -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,