Merge pull request #10200 from tonydnewell/bugfix/protobuf-7474

Fix for grpc.tools #17995 & protobuf #7474 (handle UTF-8 paths in argumentfile)
pull/10721/head
Matt Fowles Kulukundis 2 years ago committed by tony
parent 1085f8528a
commit c44d62371f
  1. 26
      src/google/protobuf/compiler/subprocess.cc

@ -47,6 +47,7 @@
#include <google/protobuf/stubs/common.h> #include <google/protobuf/stubs/common.h>
#include <google/protobuf/stubs/substitute.h> #include <google/protobuf/stubs/substitute.h>
#include <google/protobuf/message.h> #include <google/protobuf/message.h>
#include <google/protobuf/io/io_win32.h>
namespace google { namespace google {
namespace protobuf { namespace protobuf {
@ -113,7 +114,7 @@ void Subprocess::Start(const std::string& program, SearchMode search_mode) {
} }
// Setup STARTUPINFO to redirect handles. // Setup STARTUPINFO to redirect handles.
STARTUPINFOA startup_info; STARTUPINFOW startup_info;
ZeroMemory(&startup_info, sizeof(startup_info)); ZeroMemory(&startup_info, sizeof(startup_info));
startup_info.cb = sizeof(startup_info); startup_info.cb = sizeof(startup_info);
startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.dwFlags = STARTF_USESTDHANDLES;
@ -125,17 +126,30 @@ void Subprocess::Start(const std::string& program, SearchMode search_mode) {
GOOGLE_LOG(FATAL) << "GetStdHandle: " << Win32ErrorMessage(GetLastError()); GOOGLE_LOG(FATAL) << "GetStdHandle: " << Win32ErrorMessage(GetLastError());
} }
// get wide string version of program as the path may contain non-ascii characters
std::wstring wprogram;
if (!io::win32::strings::utf8_to_wcs(program.c_str(), &wprogram)) {
GOOGLE_LOG(FATAL) << "utf8_to_wcs: " << Win32ErrorMessage(GetLastError());
}
// Invoking cmd.exe allows for '.bat' files from the path as well as '.exe'. // Invoking cmd.exe allows for '.bat' files from the path as well as '.exe'.
std::string command_line = "cmd.exe /c \"" + program + "\"";
// get wide string version of command line as the path may contain non-ascii characters
std::wstring wcommand_line;
if (!io::win32::strings::utf8_to_wcs(command_line.c_str(), &wcommand_line)) {
GOOGLE_LOG(FATAL) << "utf8_to_wcs: " << Win32ErrorMessage(GetLastError());
}
// Using a malloc'ed string because CreateProcess() can mutate its second // Using a malloc'ed string because CreateProcess() can mutate its second
// parameter. // parameter.
char* command_line = wchar_t *wcommand_line_copy = _wcsdup(wcommand_line.c_str());
portable_strdup(("cmd.exe /c \"" + program + "\"").c_str());
// Create the process. // Create the process.
PROCESS_INFORMATION process_info; PROCESS_INFORMATION process_info;
if (CreateProcessA((search_mode == SEARCH_PATH) ? nullptr : program.c_str(), if (CreateProcessW((search_mode == SEARCH_PATH) ? nullptr : wprogram.c_str(),
(search_mode == SEARCH_PATH) ? command_line : nullptr, (search_mode == SEARCH_PATH) ? wcommand_line_copy : NULL,
nullptr, // process security attributes nullptr, // process security attributes
nullptr, // thread security attributes nullptr, // thread security attributes
TRUE, // inherit handles? TRUE, // inherit handles?
@ -155,7 +169,7 @@ void Subprocess::Start(const std::string& program, SearchMode search_mode) {
CloseHandleOrDie(stdin_pipe_read); CloseHandleOrDie(stdin_pipe_read);
CloseHandleOrDie(stdout_pipe_write); CloseHandleOrDie(stdout_pipe_write);
free(command_line); free(wcommand_line_copy);
} }
bool Subprocess::Communicate(const Message& input, Message* output, bool Subprocess::Communicate(const Message& input, Message* output,

Loading…
Cancel
Save