From 282702d080cd719b0c7eeb74a6e8f1a9c6900658 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 27 Mar 2019 18:13:58 -0700 Subject: [PATCH 1/3] Explicitly call getsockname after accept for unix sockets to get the sun_path --- src/core/lib/iomgr/tcp_server_posix.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc index 824db07fbfd..1e3381f57da 100644 --- a/src/core/lib/iomgr/tcp_server_posix.cc +++ b/src/core/lib/iomgr/tcp_server_posix.cc @@ -217,6 +217,18 @@ static void on_read(void* arg, grpc_error* err) { } } + /* For UNIX sockets, the accept call might not fill up the member sun_path + * of sockaddr_un, so explicitly call getsockname to get it. */ + if (grpc_is_unix_socket(&addr)) { + memset(&addr, 0, sizeof(addr)); + addr.len = static_cast(sizeof(struct sockaddr_storage)); + if (getsockname(fd, reinterpret_cast(addr.addr), + &(addr.len)) < 0) { + gpr_log(GPR_ERROR, "Failed getsockname: %s", strerror(errno)); + goto error; + } + } + grpc_set_socket_no_sigpipe_if_possible(fd); addr_str = grpc_sockaddr_to_uri(&addr); From 685372f61e31f8d2bde18e52ff74e6ae0b22f038 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 28 Mar 2019 14:22:39 -0700 Subject: [PATCH 2/3] Close fd if error on getsockname --- src/core/lib/iomgr/tcp_server_posix.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc index 1e3381f57da..baef3886530 100644 --- a/src/core/lib/iomgr/tcp_server_posix.cc +++ b/src/core/lib/iomgr/tcp_server_posix.cc @@ -225,6 +225,7 @@ static void on_read(void* arg, grpc_error* err) { if (getsockname(fd, reinterpret_cast(addr.addr), &(addr.len)) < 0) { gpr_log(GPR_ERROR, "Failed getsockname: %s", strerror(errno)); + close(fd); goto error; } } From ab29cdd28e75733987529c06da47a68c461ef989 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 9 Apr 2019 12:50:39 -0700 Subject: [PATCH 3/3] Add test --- test/core/end2end/tests/simple_request.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/core/end2end/tests/simple_request.cc b/test/core/end2end/tests/simple_request.cc index 9c018962f83..a8c57899e2c 100644 --- a/test/core/end2end/tests/simple_request.cc +++ b/test/core/end2end/tests/simple_request.cc @@ -86,6 +86,14 @@ static void end_test(grpc_end2end_test_fixture* f) { grpc_completion_queue_destroy(f->shutdown_cq); } +static void check_peer(char* peer_name) { + // If the peer name is a uds path, then check if it is filled + if (strncmp(peer_name, "unix:/", strlen("unix:/")) == 0) { + GPR_ASSERT(strncmp(peer_name, "unix:/tmp/grpc_fullstack_test.", + strlen("unix:/tmp/grpc_fullstack_test.")) == 0); + } +} + static void simple_request_body(grpc_end2end_test_config config, grpc_end2end_test_fixture f) { grpc_call* c; @@ -166,10 +174,12 @@ static void simple_request_body(grpc_end2end_test_config config, peer = grpc_call_get_peer(s); GPR_ASSERT(peer != nullptr); gpr_log(GPR_DEBUG, "server_peer=%s", peer); + check_peer(peer); gpr_free(peer); peer = grpc_call_get_peer(c); GPR_ASSERT(peer != nullptr); gpr_log(GPR_DEBUG, "client_peer=%s", peer); + check_peer(peer); gpr_free(peer); memset(ops, 0, sizeof(ops));