From 2758427b001d01e270d7b8181591e5d9aa20860f Mon Sep 17 00:00:00 2001 From: Jeremy Spiegel Date: Tue, 22 Dec 2015 16:19:20 -0800 Subject: [PATCH] THRIFT-3502: C++ TServerSocket passes small buffer to getsockname When binding with a port number of 0, TServerSocket::listen calls getsockname to retrieve the bound port number. The previous code was passing too small a buffer as a parameter, failing on Windows with errno 2 and WSAGetLastError WSAEFAULT. This change fixes the issue by using struct sockaddr_storage instead of struct sockaddr as the parameter buffer. --- lib/cpp/src/thrift/transport/TServerSocket.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index 137dc328e5a..347da4dd444 100644 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -494,14 +494,14 @@ void TServerSocket::listen() { // retrieve bind info if (port_ == 0 && retries <= retryLimit_) { - struct sockaddr sa; + struct sockaddr_storage sa; socklen_t len = sizeof(sa); std::memset(&sa, 0, len); - if (::getsockname(serverSocket_, &sa, &len) < 0) { + if (::getsockname(serverSocket_, reinterpret_cast(&sa), &len) < 0) { int errno_copy = errno; GlobalOutput.perror("TServerSocket::getPort() getsockname() ", errno_copy); } else { - if (sa.sa_family == AF_INET6) { + if (sa.ss_family == AF_INET6) { const struct sockaddr_in6* sin = reinterpret_cast(&sa); port_ = ntohs(sin->sin6_port); } else {