[Lldb-commits] [PATCH] Fix parsing of IPv6 host:port inside brackets
0001-Fix-parsing-of-IPv6-host-port-inside-brackets.patch Description: Binary data ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Fix and re-enable TestUseSourceCache.py (PR #111237)
emrekultursay wrote: > With this in mind, deleting the file is representative of an editor wanting > to save the file using the deletion strategy,... Yes. I had meant it is not representative of what Android Studio (or _some_ editors) does. > think it's not our goal here to ensure the editor cannot save the file if the > setting is true. I agree that having a test that sets `use_source_cache=true` and expects failure behavior is not a goal. But, it is how we _observe_ that the test input `cpp` source file we use satisfies the condition to use mmap. If the condition to use mmap changes (e.g., from filesize=16K to filesize=32K), then the test input source file will no longer trigger mmap, yet the `use_source_cache=false` test will keep passing. So, I think having that negative test case, despite being weird, still serves some purpose. https://github.com/llvm/llvm-project/pull/111237 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Fix and re-enable TestUseSourceCache.py (PR #111237)
emrekultursay wrote: LGTM. Thanks. https://github.com/llvm/llvm-project/pull/111237 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Fix and re-enable TestUseSourceCache.py (PR #111237)
emrekultursay wrote: OK, I figured the problem. In the test, we call `os.removeFile()` which does not actually represent the real end-user use-case (which is to edit the file and save it). Empirically, on Windows 11, I can verify that when LLDB mmaps these large files, then: 1. I can append to the file from Python (mode="a") 2. I can delete the file from Python (what the current test is doing) 3. I cannot delete the file from File Explorer => says lldb.exe is using the file 4. I cannot overwrite the file from Python (mode="w") 5. I cannot overwrite/save the file from Notepad++ 6. I can overwrite/save the file from vi. I am guessing that there are different mechanisms for deleting/editing/saving, and different editors/tools use different approaches. To make the test more representative, I replaced the `removeFile()` method with the following ``` def overwriteFile(self, src): """Write to file and return true iff file was successfully written.""" try: f = open(src, "w") f.writelines(["// hello world\n"]) return True except Exception: return False https://github.com/llvm/llvm-project/pull/111237 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Fix and re-enable TestUseSourceCache.py (PR #111237)
emrekultursay wrote: > it failed in this case because the source file is opened with the > `FILE_SHARE_DELETE` share mode, which allows the file to be removed, see > `llvm::sys::fs::openNativeFileInternal()` in > `llvm/lib/Support/Windows/Path.inc`. Was there an LLDB change about how it opens a source file? When this test was written, LLDB called: ``` liblldb.dll!shouldUseMmap(...) Line 323 at c:\src\llvm-project\llvm\lib\support\memorybuffer.cpp(327) liblldb.dll!getOpenFileImpl(...) Line 446 at c:\src\llvm-project\llvm\lib\support\memorybuffer.cpp(446) liblldb.dll!getFileAux(...) Line 254 at c:\src\llvm-project\llvm\lib\support\memorybuffer.cpp(254) liblldb.dll!llvm::WritableMemoryBuffer::getFile(...) Line 261 at c:\src\llvm-project\llvm\lib\support\memorybuffer.cpp(261) liblldb.dll!lldb_private::FileSystem::CreateDataBuffer(...) Line 294 at c:\src\llvm-project\lldb\source\host\common\filesystem.cpp(294) liblldb.dll!lldb_private::FileSystem::CreateDataBuffer(...) Line 310 at c:\src\llvm-project\lldb\source\host\common\filesystem.cpp(310) liblldb.dll!lldb_private::SourceManager::File::CommonInitializer(...) Line 459 at c:\src\llvm-project\lldb\source\core\sourcemanager.cpp(459) liblldb.dll!lldb_private::SourceManager::File::File(...) Line 397 at c:\src\llvm-project\lldb\source\core\sourcemanager.cpp(397) ``` ...and that `shouldUseMmap` was returning `true` for large files, which resulted in a `MemoryBufferMMapFile`. I don't see any relevant changes on those files, so I don't know the where `openNativeFileInternal()` comes into the picture. > Judging by this patch, that may no longer be necessary. Or does that only > apply for certain situations (certain windows versions, files which are not > large enough to be mmapped, etc.)? LLDB used memory mapping for very large files. Maybe the test `main.cpp` doesn't satisfy the "memory-mapped file" criteria any more? I couldn't find an explanation based on Windows 10 vs. Windows 11 file system locking. https://github.com/llvm/llvm-project/pull/111237 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Remove support and workarounds for Android 4 and older (PR #124047)
emrekultursay wrote: On the Android Studio side, we don't run tests on old API levels. We only run automated on latest API levels (and some best-effort manual tests on recent-ish API levels). Different features in Android Studio have different min-API requirements. To me, it seems OK to add "API-21 or newer required for native debugging" to future versions of Android Studio; so LGTM. https://github.com/llvm/llvm-project/pull/124047 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay created https://github.com/llvm/llvm-project/pull/136466 Commits 82ee31f and 2e89312 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. >From 950bafe1b6b900384b8d0f925f1cdab19a2c8e3d Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH] Fix connecting via abstract socket Commits 82ee31f and 2e89312 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..1f12f0902b954 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr*)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { + protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,1
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From b6c46b7a28a807b507f06d748ed93f20d26fdfcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH 1/2] Fix connecting via abstract socket Commit 82ee31f and Commit 2e893124 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From b6c46b7a28a807b507f06d748ed93f20d26fdfcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH 1/2] Fix connecting via abstract socket Commit 82ee31f and Commit 2e893124 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From b6c46b7a28a807b507f06d748ed93f20d26fdfcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH 1/4] Fix connecting via abstract socket Commit 82ee31f and Commit 2e893124 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From b6c46b7a28a807b507f06d748ed93f20d26fdfcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH 1/3] Fix connecting via abstract socket Commit 82ee31f and Commit 2e893124 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -182,3 +191,22 @@ std::vector DomainSocket::GetListeningConnectionURI() const { return {llvm::formatv("unix-connect://{0}", addr.sun_path)}; } + +Socket *DomainSocket::Create(NativeSocket sockfd, bool should_close, + Status &error) { +#ifdef __linux__ + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(sockfd, (struct sockaddr *)&addr, &addr_len) == -1) { +error = Status::FromErrorString( +"lldb-platform child: not a socket or error occurred"); +return nullptr; + } + + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -182,3 +191,22 @@ std::vector DomainSocket::GetListeningConnectionURI() const { return {llvm::formatv("unix-connect://{0}", addr.sun_path)}; } + +Socket *DomainSocket::Create(NativeSocket sockfd, bool should_close, + Status &error) { +#ifdef __linux__ + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(sockfd, (struct sockaddr *)&addr, &addr_len) == -1) { +error = Status::FromErrorString( +"lldb-platform child: not a socket or error occurred"); +return nullptr; + } + + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +return new AbstractSocket(sockfd, should_close); + } +#endif + return new DomainSocket(sockfd, should_close); +} emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -455,35 +455,29 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); - Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; emrekultursay wrote: Done by adding the initialization back. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -455,35 +455,29 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); - Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; - + Log *log = GetLog(LLDBLog::Platform); if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) - protocol = Socket::ProtocolTcp; - -Log *log = GetLog(LLDBLog::Platform); - NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); if (error.Fail()) { LLDB_LOGF(log, "lldb-platform child: %s", error.AsCString()); return socket_error; } -GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port); Socket *socket; -if (protocol == Socket::ProtocolTcp) +if (gdbserver_port) { socket = new TCPSocket(sockfd, /*should_close=*/true); -else { -#if LLDB_ENABLE_POSIX - socket = new DomainSocket(sockfd, /*should_close=*/true); -#else - WithColor::error() << "lldb-platform child: Unix domain sockets are not " -"supported on this platform."; - return socket_error; -#endif +} else { + socket = DomainSocket::Create(sockfd, /*should_close=*/true, error); + if (error.Fail()) { +LLDB_LOGF(log, "Failed to create socket: %s\n", error.AsCString()); +return socket_error; + } } + +Socket::SocketProtocol protocol = socket->GetSocketProtocol(); +GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port); emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay commented: PTAL. I added unit tests for the method, but I'm open to suggestions on how to improve that test. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -182,3 +191,22 @@ std::vector DomainSocket::GetListeningConnectionURI() const { return {llvm::formatv("unix-connect://{0}", addr.sun_path)}; } + +Socket *DomainSocket::Create(NativeSocket sockfd, bool should_close, + Status &error) { +#ifdef __linux__ + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(sockfd, (struct sockaddr *)&addr, &addr_len) == -1) { +error = Status::FromErrorString( emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -31,8 +31,11 @@ class DomainSocket : public Socket { std::vector GetListeningConnectionURI() const override; + static Socket *Create(NativeSocket sockfd, bool should_close, Status &error); emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -182,3 +191,20 @@ std::vector DomainSocket::GetListeningConnectionURI() const { return {llvm::formatv("unix-connect://{0}", addr.sun_path)}; } + +llvm::Expected> +DomainSocket::FromBoundNativeSocket(NativeSocket sockfd, bool should_close) { +#ifdef __linux__ + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(sockfd, (struct sockaddr *)&addr, &addr_len) == -1) +return llvm::createStringError("not a socket or error occurred"); + if (addr.sun_family != AF_UNIX) +return llvm::createStringError("Bad socket type"); emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -339,6 +342,48 @@ TEST_F(SocketTest, DomainGetConnectURI) { } #endif +#if LLDB_ENABLE_POSIX emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -339,6 +342,48 @@ TEST_F(SocketTest, DomainGetConnectURI) { } #endif +#if LLDB_ENABLE_POSIX +TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { + // Generate a name for the domain socket. + llvm::SmallString<64> name; + std::error_code EC = llvm::sys::fs::createUniqueDirectory( + "DomainSocketFromBoundNativeSocket", name); + ASSERT_FALSE(EC); + llvm::sys::path::append(name, "test"); + + DomainSocket socket(true); + Status error = socket.Listen(name, /*backlog=*/10); + ASSERT_FALSE(error.ToError()); + NativeSocket native_socket = socket.GetNativeSocket(); + + llvm::Expected> sock = + DomainSocket::FromBoundNativeSocket(native_socket, /*should_close=*/true); + ASSERT_THAT_EXPECTED(sock, llvm::Succeeded()); + ASSERT_EQ(Socket::ProtocolUnixDomain, sock->get()->GetSocketProtocol()); +} +#endif + +#if __linux__ +TEST_F(SocketTest, AbstractSocketFromBoundNativeSocket) { + // Generate a name for the abstract socket. + llvm::SmallString<64> name; + std::error_code EC = llvm::sys::fs::createUniqueDirectory( + "AbstractSocketFromBoundNativeSocket", name); + ASSERT_FALSE(EC); + llvm::sys::path::append(name, "test"); + + AbstractSocket socket; + Status error = socket.Listen(name, /*backlog=*/10); + ASSERT_FALSE(error.ToError()); + NativeSocket native_socket = socket.GetNativeSocket(); + + llvm::Expected> sock = + DomainSocket::FromBoundNativeSocket(native_socket, /*should_close=*/true); emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -339,6 +342,48 @@ TEST_F(SocketTest, DomainGetConnectURI) { } #endif +#if LLDB_ENABLE_POSIX +TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { + // Generate a name for the domain socket. + llvm::SmallString<64> name; + std::error_code EC = llvm::sys::fs::createUniqueDirectory( + "DomainSocketFromBoundNativeSocket", name); + ASSERT_FALSE(EC); + llvm::sys::path::append(name, "test"); + + DomainSocket socket(true); + Status error = socket.Listen(name, /*backlog=*/10); + ASSERT_FALSE(error.ToError()); emrekultursay wrote: Thanks! Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay commented: Thanks. PTAL. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -339,6 +342,48 @@ TEST_F(SocketTest, DomainGetConnectURI) { } #endif +#if LLDB_ENABLE_POSIX +TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { + // Generate a name for the domain socket. + llvm::SmallString<64> name; + std::error_code EC = llvm::sys::fs::createUniqueDirectory( + "DomainSocketFromBoundNativeSocket", name); + ASSERT_FALSE(EC); + llvm::sys::path::append(name, "test"); + + DomainSocket socket(true); + Status error = socket.Listen(name, /*backlog=*/10); + ASSERT_FALSE(error.ToError()); + NativeSocket native_socket = socket.GetNativeSocket(); + + llvm::Expected> sock = + DomainSocket::FromBoundNativeSocket(native_socket, /*should_close=*/true); + ASSERT_THAT_EXPECTED(sock, llvm::Succeeded()); + ASSERT_EQ(Socket::ProtocolUnixDomain, sock->get()->GetSocketProtocol()); +} +#endif + +#if __linux__ +TEST_F(SocketTest, AbstractSocketFromBoundNativeSocket) { + // Generate a name for the abstract socket. + llvm::SmallString<64> name; + std::error_code EC = llvm::sys::fs::createUniqueDirectory( + "AbstractSocketFromBoundNativeSocket", name); emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From b6c46b7a28a807b507f06d748ed93f20d26fdfcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH 1/5] Fix connecting via abstract socket Commit 82ee31f and Commit 2e893124 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
emrekultursay wrote: Thanks folks: 1. Can you please squash-and-merge this PR? (I don't have write permissions) 2. Would you like me to create a cherry-pick into release/20.x branch, or is there a separate process for cherry-picks (e.g., wait some time to validate, submit a cherry-pick request somewhere, etc.)? https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
emrekultursay wrote: We're getting `SetSockAddr` error which can only fail if the path is too long. The path generated by `createUniqueDirectory` is an absolute path to a temporary directory. I guess it can be longer than 107 bytes on the CI machines. All the other DomainSocket related tests skip the test if the generated path is longer than 107 bytes: ``` // Skip the test if the $TMPDIR is too long to hold a domain socket. if (Path.size() > 107u) return; ``` I'll add that to see if it fixes the issue. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Skip tests if socket name is longer than 107 bytes (PR #137405)
https://github.com/emrekultursay created https://github.com/llvm/llvm-project/pull/137405 To fix the test failures introduced in Commit 488eeb3 >From d7ab4d2f439e63a6145d83f0017f6e56dd2e37f9 Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Fri, 25 Apr 2025 22:04:28 + Subject: [PATCH] Skip tests if socket name is longer than 107 bytes To fix the test failures introduced in Commit 488eeb3 --- lldb/unittests/Host/SocketTest.cpp | 8 1 file changed, 8 insertions(+) diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp index 5bfb48b52f7e7..df67943892420 100644 --- a/lldb/unittests/Host/SocketTest.cpp +++ b/lldb/unittests/Host/SocketTest.cpp @@ -349,6 +349,10 @@ TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { ASSERT_FALSE(EC); llvm::sys::path::append(name, "test"); + // Skip the test if the $TMPDIR is too long to hold a domain socket. + if (name.size() > 107u) +return; + DomainSocket socket(true); Status error = socket.Listen(name, /*backlog=*/10); ASSERT_THAT_ERROR(error.takeError(), llvm::Succeeded()); @@ -369,6 +373,10 @@ TEST_F(SocketTest, AbstractSocketFromBoundNativeSocket) { llvm::sys::fs::createUniquePath("AbstractSocketFromBoundNativeSocket", name, true); llvm::sys::path::append(name, "test"); + + // Skip the test if the $TMPDIR is too long to hold a domain socket. + if (name.size() > 107u) +return; AbstractSocket socket; Status error = socket.Listen(name, /*backlog=*/10); ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Skip tests if socket name is longer than 107 bytes (PR #137405)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/137405 >From 65de31524033192d1c14af29b70b8f32bac3be55 Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Fri, 25 Apr 2025 22:04:28 + Subject: [PATCH] Skip tests if socket name is longer than 107 bytes To fix the test failures introduced in Commit 488eeb3 --- lldb/unittests/Host/SocketTest.cpp | 8 1 file changed, 8 insertions(+) diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp index 5bfb48b52f7e7..70708db57c7e3 100644 --- a/lldb/unittests/Host/SocketTest.cpp +++ b/lldb/unittests/Host/SocketTest.cpp @@ -349,6 +349,10 @@ TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { ASSERT_FALSE(EC); llvm::sys::path::append(name, "test"); + // Skip the test if the $TMPDIR is too long to hold a domain socket. + if (name.size() > 107u) +return; + DomainSocket socket(true); Status error = socket.Listen(name, /*backlog=*/10); ASSERT_THAT_ERROR(error.takeError(), llvm::Succeeded()); @@ -370,6 +374,10 @@ TEST_F(SocketTest, AbstractSocketFromBoundNativeSocket) { true); llvm::sys::path::append(name, "test"); + // Skip the test if the $TMPDIR is too long to hold a domain socket. + if (name.size() > 107u) +return; + AbstractSocket socket; Status error = socket.Listen(name, /*backlog=*/10); ASSERT_THAT_ERROR(error.takeError(), llvm::Succeeded()); ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
@@ -455,37 +455,33 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); - Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; - + Log *log = GetLog(LLDBLog::Platform); if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) - protocol = Socket::ProtocolTcp; - -Log *log = GetLog(LLDBLog::Platform); - NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); if (error.Fail()) { LLDB_LOGF(log, "lldb-platform child: %s", error.AsCString()); return socket_error; } -GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port); -Socket *socket; -if (protocol == Socket::ProtocolTcp) - socket = new TCPSocket(sockfd, /*should_close=*/true); -else { -#if LLDB_ENABLE_POSIX - socket = new DomainSocket(sockfd, /*should_close=*/true); -#else - WithColor::error() << "lldb-platform child: Unix domain sockets are not " -"supported on this platform."; - return socket_error; -#endif +std::unique_ptr socket; +if (gdbserver_port) { + socket = std::make_unique(sockfd, /*should_close=*/true); +} else { + llvm::Expected> domain_socket = + DomainSocket::FromBoundNativeSocket(sockfd, /*should_close=*/true); + if (!domain_socket) { +LLDB_LOGF(log, "Failed to create socket: %s\n", error.AsCString()); emrekultursay wrote: Done. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Skip tests if socket name is longer than 107 bytes (PR #137405)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/137405 >From 65de31524033192d1c14af29b70b8f32bac3be55 Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Fri, 25 Apr 2025 22:04:28 + Subject: [PATCH 1/2] Skip tests if socket name is longer than 107 bytes To fix the test failures introduced in Commit 488eeb3 --- lldb/unittests/Host/SocketTest.cpp | 8 1 file changed, 8 insertions(+) diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp index 5bfb48b52f7e7..70708db57c7e3 100644 --- a/lldb/unittests/Host/SocketTest.cpp +++ b/lldb/unittests/Host/SocketTest.cpp @@ -349,6 +349,10 @@ TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { ASSERT_FALSE(EC); llvm::sys::path::append(name, "test"); + // Skip the test if the $TMPDIR is too long to hold a domain socket. + if (name.size() > 107u) +return; + DomainSocket socket(true); Status error = socket.Listen(name, /*backlog=*/10); ASSERT_THAT_ERROR(error.takeError(), llvm::Succeeded()); @@ -370,6 +374,10 @@ TEST_F(SocketTest, AbstractSocketFromBoundNativeSocket) { true); llvm::sys::path::append(name, "test"); + // Skip the test if the $TMPDIR is too long to hold a domain socket. + if (name.size() > 107u) +return; + AbstractSocket socket; Status error = socket.Listen(name, /*backlog=*/10); ASSERT_THAT_ERROR(error.takeError(), llvm::Succeeded()); >From 8cfc092a631d7122ae84c454bb784f6c265f0267 Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Fri, 25 Apr 2025 22:30:26 + Subject: [PATCH 2/2] Use GTEST_SKIP instead of return --- lldb/unittests/Host/SocketTest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp index 70708db57c7e3..77366593f05f8 100644 --- a/lldb/unittests/Host/SocketTest.cpp +++ b/lldb/unittests/Host/SocketTest.cpp @@ -351,7 +351,7 @@ TEST_F(SocketTest, DomainSocketFromBoundNativeSocket) { // Skip the test if the $TMPDIR is too long to hold a domain socket. if (name.size() > 107u) -return; +GTEST_SKIP() << "$TMPDIR is too long to hold a domain socket"; DomainSocket socket(true); Status error = socket.Listen(name, /*backlog=*/10); @@ -376,7 +376,7 @@ TEST_F(SocketTest, AbstractSocketFromBoundNativeSocket) { // Skip the test if the $TMPDIR is too long to hold a domain socket. if (name.size() > 107u) -return; +GTEST_SKIP() << "$TMPDIR is too long to hold a domain socket"; AbstractSocket socket; Status error = socket.Listen(name, /*backlog=*/10); ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix Windows build (PR #137414)
https://github.com/emrekultursay created https://github.com/llvm/llvm-project/pull/137414 Windows doesn't have domain sockets, so we must properly #ifdef the code that touches DomainSocket. >From fb1ced0cd73fbd3844a887d064cf319b27d2a237 Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Fri, 25 Apr 2025 23:04:27 + Subject: [PATCH] Fix Windows build Windows doesn't have domain sockets, so we must properly #ifdef the code that touches DomainSocket. --- lldb/tools/lldb-server/lldb-platform.cpp | 6 ++ 1 file changed, 6 insertions(+) diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index b9a85370d649c..10d79c63af994 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -469,6 +469,7 @@ int main_platform(int argc, char *argv[]) { if (gdbserver_port) { socket = std::make_unique(sockfd, /*should_close=*/true); } else { +#if LLDB_ENABLE_POSIX llvm::Expected> domain_socket = DomainSocket::FromBoundNativeSocket(sockfd, /*should_close=*/true); if (!domain_socket) { @@ -477,6 +478,11 @@ int main_platform(int argc, char *argv[]) { return socket_error; } socket = std::move(domain_socket.get()); +#else + WithColor::error() << "lldb-platform child: Unix domain sockets are not " +"supported on this platform."; + return socket_error; +#endif } GDBRemoteCommunicationServerPlatform platform(socket->GetSocketProtocol(), ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
emrekultursay wrote: Thanks. Are the following patches good enough, or do we prefer a revert? - Test fix: https://github.com/llvm/llvm-project/pull/137405 - Windows fix: https://github.com/llvm/llvm-project/pull/137414 https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix Windows build (PR #137414)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/137414 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From 2aedf974b8743b9291fbd333af2eaa6d4d5cadcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH] Fix connecting via abstract socket Commits 82ee31f and 2e89312 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port);
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From b6c46b7a28a807b507f06d748ed93f20d26fdfcc Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH] Fix connecting via abstract socket Commit 82ee31f and Commit 2e893124 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay updated https://github.com/llvm/llvm-project/pull/136466 >From fd514c43019e25f36e12166b7239f7882ea7eca4 Mon Sep 17 00:00:00 2001 From: Emre Kultursay Date: Sun, 20 Apr 2025 01:11:31 + Subject: [PATCH] Fix connecting via abstract socket Commit 82ee31f and Commit 2e89312 added socket sharing, but only for unix domain sockets. That broke Android, which uses unix-abstract sockets. --- lldb/include/lldb/Host/linux/AbstractSocket.h | 1 + lldb/include/lldb/Host/posix/DomainSocket.h | 1 + lldb/source/Host/linux/AbstractSocket.cpp | 3 ++ lldb/source/Host/posix/DomainSocket.cpp | 6 +++ lldb/tools/lldb-server/lldb-platform.cpp | 40 +-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lldb/include/lldb/Host/linux/AbstractSocket.h b/lldb/include/lldb/Host/linux/AbstractSocket.h index accfd01457a5e..c6a0e2f8af63b 100644 --- a/lldb/include/lldb/Host/linux/AbstractSocket.h +++ b/lldb/include/lldb/Host/linux/AbstractSocket.h @@ -15,6 +15,7 @@ namespace lldb_private { class AbstractSocket : public DomainSocket { public: AbstractSocket(); + AbstractSocket(NativeSocket socket, bool should_close); protected: size_t GetNameOffset() const override; diff --git a/lldb/include/lldb/Host/posix/DomainSocket.h b/lldb/include/lldb/Host/posix/DomainSocket.h index 3dbe6206da2c5..562c011ee73e6 100644 --- a/lldb/include/lldb/Host/posix/DomainSocket.h +++ b/lldb/include/lldb/Host/posix/DomainSocket.h @@ -33,6 +33,7 @@ class DomainSocket : public Socket { protected: DomainSocket(SocketProtocol protocol); + DomainSocket(SocketProtocol protocol, NativeSocket socket, bool should_close); virtual size_t GetNameOffset() const; virtual void DeleteSocketFile(llvm::StringRef name); diff --git a/lldb/source/Host/linux/AbstractSocket.cpp b/lldb/source/Host/linux/AbstractSocket.cpp index 8393a80e86e72..681aa2d1ebc72 100644 --- a/lldb/source/Host/linux/AbstractSocket.cpp +++ b/lldb/source/Host/linux/AbstractSocket.cpp @@ -15,6 +15,9 @@ using namespace lldb_private; AbstractSocket::AbstractSocket() : DomainSocket(ProtocolUnixAbstract) {} +AbstractSocket::AbstractSocket(NativeSocket socket, bool should_close) +: DomainSocket(ProtocolUnixAbstract, socket, should_close) {} + size_t AbstractSocket::GetNameOffset() const { return 1; } void AbstractSocket::DeleteSocketFile(llvm::StringRef name) {} diff --git a/lldb/source/Host/posix/DomainSocket.cpp b/lldb/source/Host/posix/DomainSocket.cpp index 6c490cdda47ed..9b1e4f71bba2a 100644 --- a/lldb/source/Host/posix/DomainSocket.cpp +++ b/lldb/source/Host/posix/DomainSocket.cpp @@ -67,6 +67,12 @@ DomainSocket::DomainSocket(NativeSocket socket, m_socket = socket; } +DomainSocket::DomainSocket(SocketProtocol protocol, NativeSocket socket, + bool should_close) +: Socket(protocol, should_close) { + m_socket = socket; +} + Status DomainSocket::Connect(llvm::StringRef name) { sockaddr_un saddr_un; socklen_t saddr_un_len; diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp index 23d36ffb4cb66..59a83c28b0212 100644 --- a/lldb/tools/lldb-server/lldb-platform.cpp +++ b/lldb/tools/lldb-server/lldb-platform.cpp @@ -39,11 +39,19 @@ #if LLDB_ENABLE_POSIX #include "lldb/Host/posix/DomainSocket.h" #endif +#ifdef __linux__ +#include "lldb/Host/linux/AbstractSocket.h" +#endif #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/UriParser.h" +#if LLDB_ENABLE_POSIX +#include +#include +#endif + using namespace lldb; using namespace lldb_private; using namespace lldb_private::lldb_server; @@ -455,14 +463,28 @@ int main_platform(int argc, char *argv[]) { lldb_private::Args inferior_arguments; inferior_arguments.SetArguments(argc, const_cast(argv)); + Log *log = GetLog(LLDBLog::Platform); Socket::SocketProtocol protocol = Socket::ProtocolUnixDomain; if (fd != SharedSocket::kInvalidFD) { // Child process will handle the connection and exit. -if (gdbserver_port) +if (gdbserver_port) { protocol = Socket::ProtocolTcp; +} else { +#ifdef LLDB_ENABLE_POSIX + // Check if fd represents domain socket or abstract socket. + struct sockaddr_un addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(fd, (struct sockaddr *)&addr, &addr_len) == -1) { +LLDB_LOGF(log, "lldb-platform child: not a socket or error occurred"); +return socket_error; + } -Log *log = GetLog(LLDBLog::Platform); + if (addr.sun_family == AF_UNIX && addr.sun_path[0] == '\0') { +protocol = Socket::ProtocolUnixAbstract; + } +#endif +} NativeSocket sockfd; error = SharedSocket::GetNativeSocket(fd, sockfd); @@ -473,17 +495,27 @@ int main_platform(int argc, char *argv[]) { GDBRemoteCommunicationServerPlatform platform(protocol, gdbserver_port)
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
https://github.com/emrekultursay edited https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] Fix connecting via abstract socket (PR #136466)
emrekultursay wrote: @slydiman Could you also take a look at this PR, as you are the author of the 2 commits mentioned in the description? Thanks. https://github.com/llvm/llvm-project/pull/136466 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits