You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ro...@apache.org on 2015/10/11 01:01:37 UTC

[2/2] thrift git commit: THRIFT-3371 Abstract namespace Unix domain sockets broken in C++

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 <pa...@sidefx.com>
Authored: Thu Oct 8 16:48:45 2015 -0400
Committer: Roger Meier <ro...@apache.org>
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);