From: Roger Meier Date: Mon, 2 Sep 2013 18:43:57 +0000 (+0200) Subject: THRIFT-1481 cpp: Unix domain sockets in C++ do not support the abstract namespace X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=657b933f28ffdaedb49c5a93dc3e0c2ceeae1807;p=common%2Fthrift.git THRIFT-1481 cpp: Unix domain sockets in C++ do not support the abstract namespace Patch: Ben Craig --- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp old mode 100644 new mode 100755 index 4cecc3bb..59a08859 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -304,21 +304,21 @@ void TServerSocket::listen() { #ifndef _WIN32 // Unix Domain Socket - struct sockaddr_un address; - socklen_t len; + struct sockaddr_un address = {0}; + size_t len = path_.size()+1; - if (path_.length() > sizeof(address.sun_path)) { + if (len > sizeof(address.sun_path)) { int errno_copy = THRIFT_GET_SOCKET_ERROR; GlobalOutput.perror("TSocket::listen() Unix Domain socket path too long", errno_copy); throw TTransportException(TTransportException::NOT_OPEN, " Unix Domain socket path too long"); } address.sun_family = AF_UNIX; - THRIFT_SNPRINTF(address.sun_path, sizeof(address.sun_path), "%s", path_.c_str()); - len = sizeof(address); + memcpy(address.sun_path, path_.c_str(), len); + socklen_t structlen = static_cast(sizeof(address)); do { - if (0 == ::bind(serverSocket_, (struct sockaddr *) &address, len)) { + if (0 == ::bind(serverSocket_, (struct sockaddr *) &address, structlen)) { break; } // use short circuit evaluation here to only sleep if we need to diff --git a/lib/cpp/src/thrift/transport/TSocket.cpp b/lib/cpp/src/thrift/transport/TSocket.cpp old mode 100644 new mode 100755 index d521bb56..1ea98bd8 --- a/lib/cpp/src/thrift/transport/TSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSocket.cpp @@ -240,19 +240,19 @@ void TSocket::openConnection(struct addrinfo *res) { #ifndef _WIN32 - struct sockaddr_un address; - socklen_t len; + struct sockaddr_un address = {0}; + size_t len = path_.size()+1; - if (path_.length() > sizeof(address.sun_path)) { + if (len > sizeof(address.sun_path)) { int errno_copy = THRIFT_GET_SOCKET_ERROR; GlobalOutput.perror("TSocket::open() Unix Domain socket path too long", errno_copy); throw TTransportException(TTransportException::NOT_OPEN, " Unix Domain socket path too long"); } address.sun_family = AF_UNIX; - THRIFT_SNPRINTF(address.sun_path, sizeof(address.sun_path), "%s", path_.c_str()); - len = sizeof(address); - ret = connect(socket_, (struct sockaddr *) &address, len); + memcpy(address.sun_path, path_.c_str(), len); + socklen_t structlen = static_cast(sizeof(address)); + ret = connect(socket_, (struct sockaddr *) &address, structlen); #else GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);