THRIFT-3371 Abstract namespace Unix domain sockets broken in C++
This closes #637
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 @@
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;
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 @@
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);