|
@@ -52,6 +52,16 @@ namespace google {
|
|
namespace protobuf {
|
|
namespace protobuf {
|
|
namespace compiler {
|
|
namespace compiler {
|
|
|
|
|
|
|
|
+namespace {
|
|
|
|
+char* portable_strdup(const char* s) {
|
|
|
|
+ char* ns = malloc(strlen(s) + 1);
|
|
|
|
+ if (ns) {
|
|
|
|
+ strcpy(ns, s);
|
|
|
|
+ }
|
|
|
|
+ return ns;
|
|
|
|
+}
|
|
|
|
+} // namespace
|
|
|
|
+
|
|
#ifdef _WIN32
|
|
#ifdef _WIN32
|
|
|
|
|
|
static void CloseHandleOrDie(HANDLE handle) {
|
|
static void CloseHandleOrDie(HANDLE handle) {
|
|
@@ -115,7 +125,7 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
|
|
}
|
|
}
|
|
|
|
|
|
// CreateProcess() mutates its second parameter. WTF?
|
|
// CreateProcess() mutates its second parameter. WTF?
|
|
- char* name_copy = strdup(program.c_str());
|
|
|
|
|
|
+ char* name_copy = portable_strdup(program.c_str());
|
|
|
|
|
|
// Create the process.
|
|
// Create the process.
|
|
PROCESS_INFORMATION process_info;
|
|
PROCESS_INFORMATION process_info;
|
|
@@ -299,7 +309,7 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
|
|
GOOGLE_CHECK(pipe(stdin_pipe) != -1);
|
|
GOOGLE_CHECK(pipe(stdin_pipe) != -1);
|
|
GOOGLE_CHECK(pipe(stdout_pipe) != -1);
|
|
GOOGLE_CHECK(pipe(stdout_pipe) != -1);
|
|
|
|
|
|
- char* argv[2] = { strdup(program.c_str()), NULL };
|
|
|
|
|
|
+ char* argv[2] = { portable_strdup(program.c_str()), NULL };
|
|
|
|
|
|
child_pid_ = fork();
|
|
child_pid_ = fork();
|
|
if (child_pid_ == -1) {
|
|
if (child_pid_ == -1) {
|