From 3dcfa3fb1cec36b21ad026c618c85790a2353f72 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 23 Aug 2016 12:50:00 -0700 Subject: [PATCH] Most accept/accept4 calls in system/core don't actually want the remote address. So don't write the extra code for it or waste the kernel's time copying it around. Change-Id: I93de64064c2d4fe58ba5b5322cfa69bf31a76dad --- adb/socket_test.cpp | 5 +---- debuggerd/debuggerd.cpp | 6 +----- init/property_service.cpp | 17 +++++++---------- libsysutils/src/SocketListener.cpp | 11 +---------- lmkd/lmkd.c | 6 +----- 5 files changed, 11 insertions(+), 34 deletions(-) diff --git a/adb/socket_test.cpp b/adb/socket_test.cpp index d2ce2d875..2bb01a382 100644 --- a/adb/socket_test.cpp +++ b/adb/socket_test.cpp @@ -254,10 +254,7 @@ TEST_F(LocalSocketTest, close_socket_in_CLOSE_WAIT_state) { ASSERT_TRUE(adb_thread_create(reinterpret_cast(ClientThreadFunc), nullptr, &client_thread)); - struct sockaddr addr; - socklen_t alen; - alen = sizeof(addr); - int accept_fd = adb_socket_accept(listen_fd, &addr, &alen); + int accept_fd = adb_socket_accept(listen_fd, nullptr, nullptr); ASSERT_GE(accept_fd, 0); CloseRdHupSocketArg arg; arg.socket_fd = accept_fd; diff --git a/debuggerd/debuggerd.cpp b/debuggerd/debuggerd.cpp index c578d658b..5550bc07d 100644 --- a/debuggerd/debuggerd.cpp +++ b/debuggerd/debuggerd.cpp @@ -821,12 +821,8 @@ static int do_server() { ALOGI("debuggerd: starting\n"); for (;;) { - sockaddr_storage ss; - sockaddr* addrp = reinterpret_cast(&ss); - socklen_t alen = sizeof(ss); - ALOGV("waiting for connection\n"); - int fd = accept4(s, addrp, &alen, SOCK_CLOEXEC | SOCK_NONBLOCK); + int fd = accept4(s, nullptr, nullptr, SOCK_CLOEXEC | SOCK_NONBLOCK); if (fd == -1) { ALOGE("accept failed: %s\n", strerror(errno)); continue; diff --git a/init/property_service.cpp b/init/property_service.cpp index e2e1b16fc..9e1373312 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -227,32 +227,29 @@ int property_set(const char* name, const char* value) { static void handle_property_set_fd() { prop_msg msg; - int s; int r; - struct ucred cr; - struct sockaddr_un addr; - socklen_t addr_size = sizeof(addr); - socklen_t cr_size = sizeof(cr); char * source_ctx = NULL; - struct pollfd ufds[1]; - const int timeout_ms = 2 * 1000; /* Default 2 sec timeout for caller to send property. */ - int nr; - if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { + int s = accept(property_set_fd, nullptr, nullptr); + if (s == -1) { return; } /* Check socket options here */ + struct ucred cr; + socklen_t cr_size = sizeof(cr); if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) { close(s); PLOG(ERROR) << "Unable to receive socket options"; return; } + static constexpr int timeout_ms = 2 * 1000; /* Default 2 sec timeout for caller to send property. */ + struct pollfd ufds[1]; ufds[0].fd = s; ufds[0].events = POLLIN; ufds[0].revents = 0; - nr = TEMP_FAILURE_RETRY(poll(ufds, 1, timeout_ms)); + int nr = TEMP_FAILURE_RETRY(poll(ufds, 1, timeout_ms)); if (nr == 0) { LOG(ERROR) << "sys_prop: timeout waiting for uid " << cr.uid << " to send property message."; close(s); diff --git a/libsysutils/src/SocketListener.cpp b/libsysutils/src/SocketListener.cpp index 4d602a6aa..608abaea5 100644 --- a/libsysutils/src/SocketListener.cpp +++ b/libsysutils/src/SocketListener.cpp @@ -199,16 +199,7 @@ void SocketListener::runListener() { continue; } if (mListen && FD_ISSET(mSock, &read_fds)) { - sockaddr_storage ss; - sockaddr* addrp = reinterpret_cast(&ss); - socklen_t alen; - int c; - - do { - alen = sizeof(ss); - c = accept4(mSock, addrp, &alen, SOCK_CLOEXEC); - SLOGV("%s got %d from accept", mSocketName, c); - } while (c < 0 && errno == EINTR); + int c = TEMP_FAILURE_RETRY(accept4(mSock, nullptr, nullptr, SOCK_CLOEXEC)); if (c < 0) { SLOGE("accept failed (%s)", strerror(errno)); sleep(1); diff --git a/lmkd/lmkd.c b/lmkd/lmkd.c index 37fbdb88d..733b7845d 100644 --- a/lmkd/lmkd.c +++ b/lmkd/lmkd.c @@ -410,9 +410,6 @@ static void ctrl_data_handler(uint32_t events) { } static void ctrl_connect_handler(uint32_t events __unused) { - struct sockaddr_storage ss; - struct sockaddr *addrp = (struct sockaddr *)&ss; - socklen_t alen; struct epoll_event epev; if (ctrl_dfd >= 0) { @@ -420,8 +417,7 @@ static void ctrl_connect_handler(uint32_t events __unused) { ctrl_dfd_reopened = 1; } - alen = sizeof(ss); - ctrl_dfd = accept(ctrl_lfd, addrp, &alen); + ctrl_dfd = accept(ctrl_lfd, NULL, NULL); if (ctrl_dfd < 0) { ALOGE("lmkd control socket accept failed; errno=%d", errno);