From 4a679454d7055c09ea7c491e265b475bce582a65 Mon Sep 17 00:00:00 2001 From: Tom Cherry Date: Tue, 26 Sep 2017 16:30:03 -0700 Subject: [PATCH] init: cleanup exit() uses Primarily, this fixes a bug where a forked child of property service uses exit() instead of _exit, which has the unintended consequences of running the global destructors of init proper, which leads to unintended cleanup. Secondly, this replaces the remaining calls of exit() that really should be LOG(FATAL). Test: boot sailfish Change-Id: I779228e7d44a73186bc7685bb723c4b9278a0a2d --- init/init.cpp | 3 +-- init/property_service.cpp | 8 +++----- init/sigchld_handler.cpp | 3 +-- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/init/init.cpp b/init/init.cpp index 817b33e75..e611f18d5 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -569,8 +569,7 @@ int main(int argc, char** argv) { epoll_fd = epoll_create1(EPOLL_CLOEXEC); if (epoll_fd == -1) { - PLOG(ERROR) << "epoll_create1 failed"; - exit(1); + PLOG(FATAL) << "epoll_create1 failed"; } sigchld_handler_init(); diff --git a/init/property_service.cpp b/init/property_service.cpp index db2d47230..0df96bfff 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -73,8 +73,7 @@ static struct selabel_handle* sehandle_prop; void property_init() { if (__system_property_area_init()) { - LOG(ERROR) << "Failed to initialize property area"; - exit(1); + LOG(FATAL) << "Failed to initialize property area"; } } @@ -216,7 +215,7 @@ static void PropertyChildLaunch() { LOG(ERROR) << "property_set_async(\"" << info.name << "\", \"" << info.value << "\") failed"; } - exit(0); + _exit(0); } } @@ -712,8 +711,7 @@ void start_property_service() { property_set_fd = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, false, 0666, 0, 0, nullptr); if (property_set_fd == -1) { - PLOG(ERROR) << "start_property_service socket creation failed"; - exit(1); + PLOG(FATAL) << "start_property_service socket creation failed"; } listen(property_set_fd, 8); diff --git a/init/sigchld_handler.cpp b/init/sigchld_handler.cpp index 8fc995606..fa67199ee 100644 --- a/init/sigchld_handler.cpp +++ b/init/sigchld_handler.cpp @@ -119,8 +119,7 @@ void sigchld_handler_init() { // Create a signalling mechanism for SIGCHLD. int s[2]; if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0, s) == -1) { - PLOG(ERROR) << "socketpair failed"; - exit(1); + PLOG(FATAL) << "socketpair failed in sigchld_handler_init"; } signal_write_fd = s[0];