aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSigurd Meldgaard <sigurdm@google.com>2018-09-03 12:09:16 +0000
committerSigurd Meldgaard <sigurdm@google.com>2018-09-03 12:09:16 +0000
commit4e5ae963e855fb201aa70f2784a62c70ca3c6580 (patch)
treee3d733a9e739555e8354d52bcdfa87210bde5dc4
parentfd90f4536045bc881b8b895731fe72d89450b6b4 (diff)
downloadprotobuf-4e5ae963e855fb201aa70f2784a62c70ca3c6580.tar.gz
protobuf-4e5ae963e855fb201aa70f2784a62c70ca3c6580.tar.bz2
protobuf-4e5ae963e855fb201aa70f2784a62c70ca3c6580.zip
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..
-rw-r--r--src/google/protobuf/compiler/subprocess.cc9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/google/protobuf/compiler/subprocess.cc b/src/google/protobuf/compiler/subprocess.cc
index 2e5a89ac..5bd3d435 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,