ulidtko commented on a change in pull request #2234:
URL: https://github.com/apache/thrift/pull/2234#discussion_r485650407



##########
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:
       I'm a bit wary about this `sizeof(address)` — because of how `struct 
sockaddr` can have more data following it. What type is `address` again?..
   
   `man 7 unix` says this:
   >    **Pathname sockets**
   >       When binding a socket to a pathname, a few rules should be observed 
for maximum portability and ease of coding:
   >
   >   *  The pathname in sun_path should be null-terminated.
   >   *  The length of the pathname, including the terminating null byte, 
should not exceed the size of sun_path.
   >   *  The addrlen argument that describes the enclosing sockaddr_un 
structure should have a value of at least:
   >
   >             offsetof(struct sockaddr_un, sun_path)+strlen(addr.sun_path)+1
   >
   > or, more simply, addrlen can be specified as `sizeof(struct sockaddr_un)`.
   
   Ah, so I see, line 409, it's exactly `sockaddr_un`. So all's good.
   
   How about maybe:
   ```suggestion
         if (0 == ::bind(serverSocket_, (struct sockaddr*)&address, 
static_cast<socklen_t>(sizeof(struct sockaddr_un)))) {
   ```
   
   ? And similarly below




----------------------------------------------------------------
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]


Reply via email to