emmenlau commented on a change in pull request #2234:
URL: https://github.com/apache/thrift/pull/2234#discussion_r485654094
##########
File path: lib/cpp/src/thrift/transport/TServerSocket.cpp
##########
@@ -408,24 +407,21 @@ void TServerSocket::listen() {
}
struct sockaddr_un address;
+ // Store the zero-terminated path in address.sun_path
+ memset(&address, '\0', sizeof(address));
address.sun_family = AF_UNIX;
- memcpy(address.sun_path, path_.c_str(), len);
-
- auto structlen = static_cast<socklen_t>(sizeof(address));
+ memcpy(address.sun_path, path_.c_str(), path_.size());
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
+#ifndef __linux__
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)) {
+ if (0 == ::bind(serverSocket_, (struct sockaddr*)&address,
static_cast<socklen_t>(sizeof(address)))) {
Review comment:
After re-considering #2235, I think this PR is wrong. I'm not handling
the abstract socket paths correctly since they indeed may require `structlen`
rather than `static_cast<socklen_t>(sizeof(struct sockaddr_un))`. What do you
think?
##########
File path: lib/cpp/src/thrift/transport/TServerSocket.cpp
##########
@@ -408,24 +407,21 @@ void TServerSocket::listen() {
}
struct sockaddr_un address;
+ // Store the zero-terminated path in address.sun_path
+ memset(&address, '\0', sizeof(address));
address.sun_family = AF_UNIX;
- memcpy(address.sun_path, path_.c_str(), len);
-
- auto structlen = static_cast<socklen_t>(sizeof(address));
+ memcpy(address.sun_path, path_.c_str(), path_.size());
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
+#ifndef __linux__
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)) {
+ if (0 == ::bind(serverSocket_, (struct sockaddr*)&address,
static_cast<socklen_t>(sizeof(address)))) {
Review comment:
After re-considering #2235, I think my PR is wrong. I'm not handling the
abstract socket paths correctly since they indeed may require `structlen`
rather than `static_cast<socklen_t>(sizeof(struct sockaddr_un))`. What do you
think?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]