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 4cecc3b..59a0885
--- a/lib/cpp/src/thrift/transport/TServerSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TServerSocket.cpp
@@ -304,21 +304,21 @@
 #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<socklen_t>(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 d521bb5..1ea98bd
--- a/lib/cpp/src/thrift/transport/TSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSocket.cpp
@@ -240,19 +240,19 @@
 
 #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<socklen_t>(sizeof(address));
+    ret = connect(socket_, (struct sockaddr *) &address, structlen);
 
 #else
       GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);