From 42afe2033fddc7c43ccfeb5f20defe992d0bc1a2 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 22 Jun 2016 15:57:12 -0700 Subject: [PATCH] adb: don't dup local socket fd. SIGHUP handling depends on the local socket fd being fully closed in order to trigger an event on its counterpart. Release the local socket fd inside of Subprocess when returning it to ensure this. Bug: http://b/29565233 Change-Id: I13b17bcddf0b396a5f4880f9e410fbbf24d9370d --- adb/shell_service.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/adb/shell_service.cpp b/adb/shell_service.cpp index f98394d0d..104f39947 100644 --- a/adb/shell_service.cpp +++ b/adb/shell_service.cpp @@ -155,7 +155,7 @@ class Subprocess { const std::string& command() const { return command_; } - int local_socket_fd() const { return local_socket_sfd_.fd(); } + int ReleaseLocalSocket() { return local_socket_sfd_.Release(); } pid_t pid() const { return pid_; } @@ -450,7 +450,7 @@ void Subprocess::ThreadHandler(void* userdata) { Subprocess* subprocess = reinterpret_cast(userdata); adb_thread_setname(android::base::StringPrintf( - "shell srvc %d", subprocess->local_socket_fd())); + "shell srvc %d", subprocess->pid())); D("passing data streams for PID %d", subprocess->pid()); subprocess->PassDataStreams(); @@ -761,14 +761,13 @@ int StartSubprocess(const char* name, const char* terminal_type, return ReportError(protocol, error); } - unique_fd local_socket(dup(subprocess->local_socket_fd())); - D("subprocess creation successful: local_socket_fd=%d, pid=%d", local_socket.get(), - subprocess->pid()); + int local_socket = subprocess->ReleaseLocalSocket(); + D("subprocess creation successful: local_socket_fd=%d, pid=%d", local_socket, subprocess->pid()); if (!Subprocess::StartThread(std::move(subprocess), &error)) { LOG(ERROR) << "failed to start subprocess management thread: " << error; return ReportError(protocol, error); } - return local_socket.release(); + return local_socket; }