THRIFT-3371 Abstract namespace Unix domain sockets broken in C++ This closes #637
Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/5d93b04f Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/5d93b04f Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/5d93b04f Branch: refs/heads/master Commit: 5d93b04f9ee4b75dc9b82122fef2a759f88d9fdb Parents: dd08f6e Author: pavlo <[email protected]> Authored: Thu Oct 8 16:48:45 2015 -0400 Committer: Roger Meier <[email protected]> Committed: Sun Oct 11 00:48:59 2015 +0200 ---------------------------------------------------------------------- lib/cpp/src/thrift/transport/TServerSocket.cpp | 12 ++++++++++++ lib/cpp/src/thrift/transport/TSocket.cpp | 13 +++++++++++++ 2 files changed, 25 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/5d93b04f/lib/cpp/src/thrift/transport/TServerSocket.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TServerSocket.cpp b/lib/cpp/src/thrift/transport/TServerSocket.cpp index daa1524..0c973ee 100644 --- a/lib/cpp/src/thrift/transport/TServerSocket.cpp +++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp @@ -420,8 +420,20 @@ void TServerSocket::listen() { struct sockaddr_un address; address.sun_family = AF_UNIX; memcpy(address.sun_path, path_.c_str(), len); + socklen_t structlen = static_cast<socklen_t>(sizeof(address)); + if (!address.sun_path[0]) { // abstract namespace socket +#ifdef __linux__ + // sun_path is not null-terminated in this case and structlen determines its length + structlen -= sizeof(address.sun_path) - len; +#else + GlobalOutput.perror("TSocket::open() Abstract Namespace Domain sockets only supported on linux: ", -99); + throw TTransportException(TTransportException::NOT_OPEN, + " Abstract Namespace Domain socket path not supported"); +#endif + } + do { if (0 == ::bind(serverSocket_, (struct sockaddr*)&address, structlen)) { break; http://git-wip-us.apache.org/repos/asf/thrift/blob/5d93b04f/lib/cpp/src/thrift/transport/TSocket.cpp ---------------------------------------------------------------------- diff --git a/lib/cpp/src/thrift/transport/TSocket.cpp b/lib/cpp/src/thrift/transport/TSocket.cpp index d336bb4..6ce524b 100644 --- a/lib/cpp/src/thrift/transport/TSocket.cpp +++ b/lib/cpp/src/thrift/transport/TSocket.cpp @@ -314,7 +314,20 @@ void TSocket::openConnection(struct addrinfo* res) { struct sockaddr_un address; address.sun_family = AF_UNIX; memcpy(address.sun_path, path_.c_str(), len); + socklen_t structlen = static_cast<socklen_t>(sizeof(address)); + + if (!address.sun_path[0]) { // abstract namespace socket +#ifdef __linux__ + // sun_path is not null-terminated in this case and structlen determines its length + structlen -= sizeof(address.sun_path) - len; +#else + GlobalOutput.perror("TSocket::open() Abstract Namespace Domain sockets only supported on linux: ", -99); + throw TTransportException(TTransportException::NOT_OPEN, + " Abstract Namespace Domain socket path not supported"); +#endif + } + ret = connect(socket_, (struct sockaddr*)&address, structlen); #else GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);
