summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kansho Nishida <kansho@google.com> 2019-07-04 15:18:48 +0900
committer Kansho Nishida <kansho@google.com> 2019-07-04 15:27:51 +0900
commit910511e5dcd84e0f8bea5e3cb4da2965e19e39cd (patch)
treeb8d915919204afd7a974f8eb90540b701f3ce441
parent323343aa0ed4bb57df078af366efea3bc62165da (diff)
dumpstate: set backlog to zero
Set backlog to 0 to make sure that queue size will be minimum. In Linux, because the minimum queue will be 1, connect() will be blocked if the other clients already called connect() and the connection request was not accepted. Bug: 123306389 Bug: 135575100 Test: execute bugreport in parallel Change-Id: Iee94de88deb82746818b729387ed9cd39e9b2f99 Signed-off-by: Kansho Nishida <kansho@google.com>
-rw-r--r--cmds/dumpstate/utils.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/cmds/dumpstate/utils.cpp b/cmds/dumpstate/utils.cpp
index 4cbf5776d3..e08c80627c 100644
--- a/cmds/dumpstate/utils.cpp
+++ b/cmds/dumpstate/utils.cpp
@@ -725,7 +725,11 @@ int open_socket(const char *service) {
return -1;
}
fcntl(s, F_SETFD, FD_CLOEXEC);
- if (listen(s, 4) < 0) {
+
+ // Set backlog to 0 to make sure that queue size will be minimum.
+ // In Linux, because the minimum queue will be 1, connect() will be blocked
+ // if the other clients already called connect() and the connection request was not accepted.
+ if (listen(s, 0) < 0) {
MYLOGE("listen(control socket): %s\n", strerror(errno));
return -1;
}
@@ -736,6 +740,9 @@ int open_socket(const char *service) {
// Close socket just after accept(), to make sure that connect() by client will get error
// when the socket is used by the other services.
+ // There is still a race condition possibility between accept and close, but there is no way
+ // to close-on-accept atomically.
+ // See detail; b/123306389#comment25
close(s);
if (fd < 0) {