Index: runtime/bin/process_linux.cc |
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc |
index bd4ed87160dfa2bc587ff182826623ba788b84b7..01b17a9a9d442e80343e50f9588a0dfafdba905c 100644 |
--- a/runtime/bin/process_linux.cc |
+++ b/runtime/bin/process_linux.cc |
@@ -259,16 +259,8 @@ bool ExitCodeHandler::thread_terminated_ = false; |
dart::Monitor ExitCodeHandler::thread_terminate_monitor_; |
-static char* SafeStrNCpy(char* dest, const char* src, size_t n) { |
- strncpy(dest, src, n); |
- dest[n - 1] = '\0'; |
- return dest; |
-} |
- |
- |
-static void SetChildOsErrorMessage(char* os_error_message, |
- int os_error_message_len) { |
- SafeStrNCpy(os_error_message, strerror(errno), os_error_message_len); |
+static void SetChildOsErrorMessage(char** os_error_message) { |
+ *os_error_message = strdup(strerror(errno)); |
} |
@@ -316,8 +308,7 @@ int Process::Start(const char* path, |
intptr_t* err, |
intptr_t* id, |
intptr_t* exit_event, |
- char* os_error_message, |
- int os_error_message_len) { |
+ char** os_error_message) { |
pid_t pid; |
int read_in[2]; // Pipe for stdout to child process. |
int read_err[2]; // Pipe for stderr to child process. |
@@ -327,50 +318,50 @@ int Process::Start(const char* path, |
bool initialized = ExitCodeHandler::EnsureInitialized(); |
if (!initialized) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
Log::PrintErr( |
"Error initializing exit code handler: %s\n", |
- os_error_message); |
+ *os_error_message); |
return errno; |
} |
result = TEMP_FAILURE_RETRY(pipe(read_in)); |
if (result < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
- Log::PrintErr("Error pipe creation failed: %s\n", os_error_message); |
+ SetChildOsErrorMessage(os_error_message); |
+ Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message); |
return errno; |
} |
result = TEMP_FAILURE_RETRY(pipe(read_err)); |
if (result < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
TEMP_FAILURE_RETRY(close(read_in[0])); |
TEMP_FAILURE_RETRY(close(read_in[1])); |
- Log::PrintErr("Error pipe creation failed: %s\n", os_error_message); |
+ Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message); |
return errno; |
} |
result = TEMP_FAILURE_RETRY(pipe(write_out)); |
if (result < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
TEMP_FAILURE_RETRY(close(read_in[0])); |
TEMP_FAILURE_RETRY(close(read_in[1])); |
TEMP_FAILURE_RETRY(close(read_err[0])); |
TEMP_FAILURE_RETRY(close(read_err[1])); |
- Log::PrintErr("Error pipe creation failed: %s\n", os_error_message); |
+ Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message); |
return errno; |
} |
result = TEMP_FAILURE_RETRY(pipe(exec_control)); |
if (result < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
TEMP_FAILURE_RETRY(close(read_in[0])); |
TEMP_FAILURE_RETRY(close(read_in[1])); |
TEMP_FAILURE_RETRY(close(read_err[0])); |
TEMP_FAILURE_RETRY(close(read_err[1])); |
TEMP_FAILURE_RETRY(close(write_out[0])); |
TEMP_FAILURE_RETRY(close(write_out[1])); |
- Log::PrintErr("Error pipe creation failed: %s\n", os_error_message); |
+ Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message); |
return errno; |
} |
@@ -380,7 +371,7 @@ int Process::Start(const char* path, |
F_SETFD, |
TEMP_FAILURE_RETRY(fcntl(exec_control[1], F_GETFD)) | FD_CLOEXEC)); |
if (result < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
TEMP_FAILURE_RETRY(close(read_in[0])); |
TEMP_FAILURE_RETRY(close(read_in[1])); |
TEMP_FAILURE_RETRY(close(read_err[0])); |
@@ -389,7 +380,7 @@ int Process::Start(const char* path, |
TEMP_FAILURE_RETRY(close(write_out[1])); |
TEMP_FAILURE_RETRY(close(exec_control[0])); |
TEMP_FAILURE_RETRY(close(exec_control[1])); |
- Log::PrintErr("fcntl failed: %s\n", os_error_message); |
+ Log::PrintErr("fcntl failed: %s\n", *os_error_message); |
return errno; |
} |
@@ -418,7 +409,7 @@ int Process::Start(const char* path, |
} |
pid = TEMP_FAILURE_RETRY(fork()); |
if (pid < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
delete[] program_arguments; |
TEMP_FAILURE_RETRY(close(read_in[0])); |
TEMP_FAILURE_RETRY(close(read_in[1])); |
@@ -481,14 +472,14 @@ int Process::Start(const char* path, |
int event_fds[2]; |
result = TEMP_FAILURE_RETRY(pipe(event_fds)); |
if (result < 0) { |
- SetChildOsErrorMessage(os_error_message, os_error_message_len); |
+ SetChildOsErrorMessage(os_error_message); |
TEMP_FAILURE_RETRY(close(read_in[0])); |
TEMP_FAILURE_RETRY(close(read_in[1])); |
TEMP_FAILURE_RETRY(close(read_err[0])); |
TEMP_FAILURE_RETRY(close(read_err[1])); |
TEMP_FAILURE_RETRY(close(write_out[0])); |
TEMP_FAILURE_RETRY(close(write_out[1])); |
- Log::PrintErr("Error pipe creation failed: %s\n", os_error_message); |
+ Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message); |
return errno; |
} |
@@ -514,10 +505,13 @@ int Process::Start(const char* path, |
FDUtils::ReadFromBlocking( |
exec_control[0], &child_errno, sizeof(child_errno)); |
if (bytes_read == sizeof(child_errno)) { |
- bytes_read = FDUtils::ReadFromBlocking(exec_control[0], |
- os_error_message, |
- os_error_message_len); |
- os_error_message[os_error_message_len - 1] = '\0'; |
+ static const int kMaxMessageSize = 256; |
+ char* message = static_cast<char*>(malloc(kMaxMessageSize)); |
+ bytes_read = FDUtils::ReadFromBlocking(exec_control[0], |
+ message, |
+ kMaxMessageSize); |
+ message[kMaxMessageSize - 1] = '\0'; |
+ *os_error_message = message; |
} |
TEMP_FAILURE_RETRY(close(exec_control[0])); |