Set WSA_FLAG_NO_HANDLE_INHERIT flag wherever the WSASocket is used.

Check WSA_FLAG_NO_HANDLE_INHERIT is supported.
pull/18060/head
frazenshtein 6 years ago
parent 48773405dd
commit 76e9d1add7
  1. 2
      src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc
  2. 8
      src/core/lib/iomgr/endpoint_pair_windows.cc
  3. 21
      src/core/lib/iomgr/socket_windows.cc
  4. 9
      src/core/lib/iomgr/socket_windows.h
  5. 4
      src/core/lib/iomgr/tcp_client_windows.cc
  6. 4
      src/core/lib/iomgr/tcp_server_windows.cc
  7. 4
      test/cpp/naming/resolver_component_test.cc

@ -442,7 +442,7 @@ class SockToPolledFdMap {
*/
static ares_socket_t Socket(int af, int type, int protocol, void* user_data) {
SockToPolledFdMap* map = static_cast<SockToPolledFdMap*>(user_data);
SOCKET s = WSASocket(af, type, protocol, nullptr, 0, WSA_FLAG_OVERLAPPED);
SOCKET s = grpc_create_wsa_socket(af, type, protocol, nullptr, 0, WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
if (s == INVALID_SOCKET) {
return s;
}

@ -40,8 +40,8 @@ static void create_sockets(SOCKET sv[2]) {
SOCKADDR_IN addr;
int addr_len = sizeof(addr);
lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED);
lst_sock = grpc_create_wsa_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
GPR_ASSERT(lst_sock != INVALID_SOCKET);
memset(&addr, 0, sizeof(addr));
@ -53,8 +53,8 @@ static void create_sockets(SOCKET sv[2]) {
GPR_ASSERT(getsockname(lst_sock, (grpc_sockaddr*)&addr, &addr_len) !=
SOCKET_ERROR);
cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED);
cli_sock = grpc_create_wsa_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
GPR_ASSERT(cli_sock != INVALID_SOCKET);
GPR_ASSERT(WSAConnect(cli_sock, (grpc_sockaddr*)&addr, addr_len, NULL, NULL,

@ -181,4 +181,25 @@ int grpc_ipv6_loopback_available(void) {
return g_ipv6_loopback_available;
}
SOCKET grpc_create_wsa_socket(int family,
int type,
int protocol,
LPWSAPROTOCOL_INFOA protocol_info,
GROUP group,
DWORD flags) {
bool is_wsa_no_handle_inherit_set = flags & WSA_FLAG_NO_HANDLE_INHERIT;
if (!g_is_wsa_no_handle_inherit_supported && is_wsa_no_handle_inherit_set) {
flags ^= WSA_FLAG_NO_HANDLE_INHERIT;
}
SOCKET sock = WSASocket(family, type, protocol, protocol_info, group, flags);
/* WSA_FLAG_NO_HANDLE_INHERIT may be not supported on the older Windows versions, see
https://msdn.microsoft.com/en-us/library/windows/desktop/ms742212(v=vs.85).aspx
for details. */
if (sock == INVALID_SOCKET && is_wsa_no_handle_inherit_set) {
g_is_wsa_no_handle_inherit_supported = false;
sock = WSASocket(family, type, protocol, protocol_info, group, flags ^ WSA_FLAG_NO_HANDLE_INHERIT);
}
return sock;
}
#endif /* GRPC_WINSOCK_SOCKET */

@ -114,6 +114,15 @@ void grpc_socket_become_ready(grpc_winsocket* winsocket,
The value is probed once, and cached for the life of the process. */
int grpc_ipv6_loopback_available(void);
static bool g_is_wsa_no_handle_inherit_supported = true;
SOCKET grpc_create_wsa_socket(int family,
int type,
int protocol,
LPWSAPROTOCOL_INFOA protocol_info,
GROUP group,
DWORD flags);
#endif
#endif /* GRPC_CORE_LIB_IOMGR_SOCKET_WINDOWS_H */

@ -147,8 +147,8 @@ static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
addr = &addr6_v4mapped;
}
sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED);
sock = grpc_create_wsa_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
if (sock == INVALID_SOCKET) {
error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
goto failure;

@ -254,7 +254,7 @@ static grpc_error* start_accept_locked(grpc_tcp_listener* port) {
return GRPC_ERROR_NONE;
}
sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
sock = grpc_create_wsa_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
if (sock == INVALID_SOCKET) {
error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
@ -492,7 +492,7 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s,
addr = &wildcard;
}
sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
sock = grpc_create_wsa_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
if (sock == INVALID_SOCKET) {
error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");

@ -279,8 +279,8 @@ void OpenAndCloseSocketsStressLoop(int dummy_port, gpr_event* done_ev) {
}
std::vector<int> sockets;
for (size_t i = 0; i < 50; i++) {
SOCKET s = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, nullptr, 0,
WSA_FLAG_OVERLAPPED);
SOCKET s = grpc_create_wsa_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, nullptr, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
ASSERT_TRUE(s != BAD_SOCKET_RETURN_VAL)
<< "Failed to create TCP ipv6 socket";
gpr_log(GPR_DEBUG, "Opened socket: %d", s);

Loading…
Cancel
Save