Chromium Code Reviews| Index: runtime/bin/process_linux.cc |
| diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc |
| index cd9c639b9fa6abdb9bee4784a50faa7c8e3996cd..79957c28ce34934b5c03bd47602c6d0e3631aadd 100644 |
| --- a/runtime/bin/process_linux.cc |
| +++ b/runtime/bin/process_linux.cc |
| @@ -23,9 +23,6 @@ |
| #include "bin/thread.h" |
| -extern char **environ; |
| - |
| - |
| namespace dart { |
| namespace bin { |
| @@ -153,7 +150,7 @@ class ExitCodeHandler { |
| // Fork to wake up waitpid. |
| if (TEMP_FAILURE_RETRY(fork()) == 0) { |
| - exit(0); |
| + _exit(0); |
| } |
| monitor_->Notify(); |
| @@ -413,7 +410,7 @@ class ProcessStarter { |
| int bytes_read = FDUtils::ReadFromBlocking(read_in_[0], &msg, sizeof(msg)); |
| if (bytes_read != sizeof(msg)) { |
| perror("Failed receiving notification message"); |
| - exit(1); |
| + _exit(1); |
|
Søren Gjesse
2015/06/10 07:20:25
Good catch!
|
| } |
| if (mode_ == kNormal) { |
| ExecProcess(); |
| @@ -442,11 +439,14 @@ class ProcessStarter { |
| } |
| if (program_environment_ != NULL) { |
| - environ = program_environment_; |
| + VOID_TEMP_FAILURE_RETRY( |
| + execvpe(path_, const_cast<char* const*>(program_arguments_), |
| + program_environment_)); |
| + } else { |
| + VOID_TEMP_FAILURE_RETRY( |
| + execvp(path_, const_cast<char* const*>(program_arguments_))); |
| } |
| - VOID_TEMP_FAILURE_RETRY( |
| - execvp(path_, const_cast<char* const*>(program_arguments_))); |
| ReportChildError(); |
| } |
| @@ -500,12 +500,12 @@ class ProcessStarter { |
| ReportChildError(); |
| } else { |
| // Exit the intermeiate process. |
|
Søren Gjesse
2015/06/10 07:20:25
Not you fault, but please change
intermeiate -> i
Anders Johnsen
2015/06/10 08:00:45
Done.
|
| - exit(0); |
| + _exit(0); |
| } |
| } |
| } else { |
| // Exit the intermeiate process. |
|
Søren Gjesse
2015/06/10 07:20:25
ditto.
Anders Johnsen
2015/06/10 08:00:45
Done.
|
| - exit(0); |
| + _exit(0); |
| } |
| } |
| @@ -535,7 +535,7 @@ class ProcessStarter { |
| FDUtils::ReadFromBlocking( |
| exec_control_[0], &child_errno, sizeof(child_errno)); |
| if (bytes_read == sizeof(child_errno)) { |
| - ReadChildError(); |
| + ReadChildError(child_errno); |
| return child_errno; |
| } else if (bytes_read == -1) { |
| return errno; |
| @@ -559,7 +559,7 @@ class ProcessStarter { |
| } else if (bytes_read == 2 * sizeof(int)) { |
| *pid = result[0]; |
| child_errno = result[1]; |
| - ReadChildError(); |
| + ReadChildError(child_errno); |
| return child_errno; |
| } else if (bytes_read == -1) { |
| return errno; |
| @@ -648,21 +648,12 @@ class ProcessStarter { |
| void ReportChildError() { |
| - // In the case of failure in the child process write the errno and |
| - // the OS error message to the exec control pipe and exit. |
| + // In the case of failure in the child process write the errno to the exec |
| + // control pipe and exit. |
| int child_errno = errno; |
| - const int kBufferSize = 1024; |
| - char error_buf[kBufferSize]; |
| - char* os_error_message = strerror_r(errno, error_buf, kBufferSize); |
| - int bytes_written = |
| - FDUtils::WriteToBlocking( |
| - exec_control_[1], &child_errno, sizeof(child_errno)); |
| - if (bytes_written == sizeof(child_errno)) { |
| - FDUtils::WriteToBlocking( |
| - exec_control_[1], os_error_message, strlen(os_error_message) + 1); |
| - } |
| - VOID_TEMP_FAILURE_RETRY(close(exec_control_[1])); |
| - exit(1); |
| + FDUtils::WriteToBlocking( |
| + exec_control_[1], &child_errno, sizeof(child_errno)); |
| + _exit(1); |
| } |
| @@ -676,16 +667,16 @@ class ProcessStarter { |
| } |
| - void ReadChildError() { |
| + void ReadChildError(int child_errno) { |
|
Søren Gjesse
2015/06/10 07:20:25
Please rename this to e.g. SetOSErrorMessage.
Anders Johnsen
2015/06/10 08:00:45
Done.
|
| const int kMaxMessageSize = 256; |
| - char* message = static_cast<char*>(malloc(kMaxMessageSize)); |
| - if (message != NULL) { |
| - FDUtils::ReadFromBlocking(exec_control_[0], message, kMaxMessageSize); |
| - message[kMaxMessageSize - 1] = '\0'; |
| + char* message = static_cast<char*>(calloc(kMaxMessageSize, 0)); |
| + char* os_error_message = strerror_r( |
| + child_errno, message, kMaxMessageSize - 1); |
| + if (message == os_error_message) { |
| *os_error_message_ = message; |
| } else { |
| - // Could not get error message. It will be NULL. |
| - ASSERT(*os_error_message_ == NULL); |
| + free(message); |
| + *os_error_message_ = strdup(os_error_message); |
| } |
| } |