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);