|  | @@ -52,6 +52,16 @@ namespace google {
 | 
	
		
			
				|  |  |  namespace protobuf {
 | 
	
		
			
				|  |  |  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
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void CloseHandleOrDie(HANDLE handle) {
 | 
	
	
		
			
				|  | @@ -115,7 +125,7 @@ void Subprocess::Start(const string& program, SearchMode search_mode) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // CreateProcess() mutates its second parameter.  WTF?
 | 
	
		
			
				|  |  | -  char* name_copy = strdup(program.c_str());
 | 
	
		
			
				|  |  | +  char* name_copy = portable_strdup(program.c_str());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Create the process.
 | 
	
		
			
				|  |  |    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(stdout_pipe) != -1);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  char* argv[2] = { strdup(program.c_str()), NULL };
 | 
	
		
			
				|  |  | +  char* argv[2] = { portable_strdup(program.c_str()), NULL };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    child_pid_ = fork();
 | 
	
		
			
				|  |  |    if (child_pid_ == -1) {
 |