[Lldb-commits] [lldb] 5685eb9 - [lldb] Fix DomainSocket::GetSocketName for unnamed sockets

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Thu Sep 23 03:32:35 PDT 2021


Author: Pavel Labath
Date: 2021-09-23T12:30:18+02:00
New Revision: 5685eb950da7c6901c8b264a3c93e8ea63b34d3d

URL: https://github.com/llvm/llvm-project/commit/5685eb950da7c6901c8b264a3c93e8ea63b34d3d
DIFF: https://github.com/llvm/llvm-project/commit/5685eb950da7c6901c8b264a3c93e8ea63b34d3d.diff

LOG: [lldb] Fix DomainSocket::GetSocketName for unnamed sockets

getpeername will return addrlen = 2 (sizeof sa_family_t) for unnamed
sockets (those not assigned a name with bind(2)). This is typically true
for client sockets as well as those created by socketpair(2).

This GetSocketName used to crash for sockets which were connected to
these kinds of sockets. Now it returns an empty string.

Added: 
    

Modified: 
    lldb/source/Host/posix/DomainSocket.cpp
    lldb/unittests/Host/SocketTest.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp
index 7322b15200b4d..790458ee13d00 100644
--- a/lldb/source/Host/posix/DomainSocket.cpp
+++ b/lldb/source/Host/posix/DomainSocket.cpp
@@ -127,29 +127,34 @@ void DomainSocket::DeleteSocketFile(llvm::StringRef name) {
 }
 
 std::string DomainSocket::GetSocketName() const {
-  if (m_socket != kInvalidSocketValue) {
-    struct sockaddr_un saddr_un;
-    saddr_un.sun_family = AF_UNIX;
-    socklen_t sock_addr_len = sizeof(struct sockaddr_un);
-    if (::getpeername(m_socket, (struct sockaddr *)&saddr_un, &sock_addr_len) ==
-        0) {
-      std::string name(saddr_un.sun_path + GetNameOffset(),
-                       sock_addr_len -
-                           offsetof(struct sockaddr_un, sun_path) -
+  if (m_socket == kInvalidSocketValue)
+    return "";
+
+  struct sockaddr_un saddr_un;
+  saddr_un.sun_family = AF_UNIX;
+  socklen_t sock_addr_len = sizeof(struct sockaddr_un);
+  if (::getpeername(m_socket, (struct sockaddr *)&saddr_un, &sock_addr_len) !=
+      0)
+    return "";
+
+  if (sock_addr_len <= offsetof(struct sockaddr_un, sun_path))
+    return ""; // Unnamed domain socket
+
+  llvm::StringRef name(saddr_un.sun_path + GetNameOffset(),
+                       sock_addr_len - offsetof(struct sockaddr_un, sun_path) -
                            GetNameOffset());
-      if (name.back() == '\0') name.pop_back();
-      return name;
-    }
-  }
-  return "";
+  if (name.back() == '\0')
+    name = name.drop_back();
+
+  return name.str();
 }
 
 std::string DomainSocket::GetRemoteConnectionURI() const {
-  if (m_socket != kInvalidSocketValue) {
-    return std::string(llvm::formatv(
-        "{0}://{1}",
-        GetNameOffset() == 0 ? "unix-connect" : "unix-abstract-connect",
-        GetSocketName()));
-  }
-  return "";
+  std::string name = GetSocketName();
+  if (name.empty())
+    return name;
+
+  return llvm::formatv(
+      "{0}://{1}",
+      GetNameOffset() == 0 ? "unix-connect" : "unix-abstract-connect", name);
 }

diff  --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp
index 27d42f835718b..5593b7726919b 100644
--- a/lldb/unittests/Host/SocketTest.cpp
+++ b/lldb/unittests/Host/SocketTest.cpp
@@ -225,6 +225,8 @@ TEST_P(SocketTest, DomainGetConnectURI) {
   EXPECT_TRUE(UriParser::Parse(uri, scheme, hostname, port, path));
   EXPECT_EQ(scheme, "unix-connect");
   EXPECT_EQ(path, domain_path);
+
+  EXPECT_EQ(socket_b_up->GetRemoteConnectionURI(), "");
 }
 #endif
 


        


More information about the lldb-commits mailing list