From 0963dbd07dc3706dcc9132b69b34934eb086ae7a Mon Sep 17 00:00:00 2001 From: Eric Jeong Date: Fri, 17 Apr 2020 16:50:05 -0700 Subject: [PATCH] Stop socket listener when terminating by SIGTERM - During the termination, StatsService is stopped while StatsSocketListener is still running. - This could cause invalid thread access. Bug: 147316537 Test: Run a test app which keeps sending StatsLog and repeatedly execute adb shell su root kill `pidof statsd`. statsd should not crash. Change-Id: Iedd2dcb892f704bdba9adc864afa696de64b8e4c --- cmds/statsd/src/main.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp index e3945334aeca9..cd9c4e5b947b8 100644 --- a/cmds/statsd/src/main.cpp +++ b/cmds/statsd/src/main.cpp @@ -37,6 +37,7 @@ using std::shared_ptr; using std::make_shared; shared_ptr gStatsService = nullptr; +sp gSocketListener = nullptr; void signalHandler(int sig) { if (sig == SIGPIPE) { @@ -47,6 +48,7 @@ void signalHandler(int sig) { return; } + if (gSocketListener != nullptr) gSocketListener->stopListener(); if (gStatsService != nullptr) gStatsService->Terminate(); ALOGW("statsd terminated on receiving signal %d.", sig); exit(1); @@ -92,11 +94,11 @@ int main(int /*argc*/, char** /*argv*/) { gStatsService->Startup(); - sp socketListener = new StatsSocketListener(eventQueue); + gSocketListener = new StatsSocketListener(eventQueue); ALOGI("Statsd starts to listen to socket."); // Backlog and /proc/sys/net/unix/max_dgram_qlen set to large value - if (socketListener->startListener(600)) { + if (gSocketListener->startListener(600)) { exit(1); }