Merge "init: Cleanly exit subcontext processes upon init's death"

This commit is contained in:
Treehugger Robot 2018-09-22 00:12:09 +00:00 committed by Gerrit Code Review
commit f86e85cb0a
1 changed files with 9 additions and 1 deletions

View File

@ -62,7 +62,9 @@ constexpr size_t kBufferSize = 4096;
Result<std::string> ReadMessage(int socket) { Result<std::string> ReadMessage(int socket) {
char buffer[kBufferSize] = {}; char buffer[kBufferSize] = {};
auto result = TEMP_FAILURE_RETRY(recv(socket, buffer, sizeof(buffer), 0)); auto result = TEMP_FAILURE_RETRY(recv(socket, buffer, sizeof(buffer), 0));
if (result <= 0) { if (result == 0) {
return Error();
} else if (result < 0) {
return ErrnoError(); return ErrnoError();
} }
return std::string(buffer, result); return std::string(buffer, result);
@ -175,6 +177,12 @@ void SubcontextProcess::MainLoop() {
auto init_message = ReadMessage(init_fd_); auto init_message = ReadMessage(init_fd_);
if (!init_message) { if (!init_message) {
if (init_message.error_errno() == 0) {
// If the init file descriptor was closed, let's exit quietly. If
// this was accidental, init will restart us. If init died, this
// avoids calling abort(3) unnecessarily.
return;
}
LOG(FATAL) << "Could not read message from init: " << init_message.error(); LOG(FATAL) << "Could not read message from init: " << init_message.error();
} }