[llvm-branch-commits] [lldb] release/20.x: [lldb] Use correct path for lldb-server executable (#131519) (PR #134072)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Apr 2 05:16:36 PDT 2025
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/134072
Backport 945c494e2c3c078e26ff521ef3e9455e0ff764ac
Requested by: @DavidSpickett
>From c8c12d84c18a6ebd10151c2e354002a8b6642af3 Mon Sep 17 00:00:00 2001
From: Yuval Deutscher <yuvald at sweet.security>
Date: Mon, 31 Mar 2025 18:20:40 +0300
Subject: [PATCH] [lldb] Use correct path for lldb-server executable (#131519)
Hey,
This solves an issue where running lldb-server-20 with a non-absolute
path (for example, when it's installed into `/usr/bin` and the user runs
it as `lldb-server-20 ...` and not `/usr/bin/lldb-server-20 ...`) fails
with `error: spawn_process failed: execve failed: No such file or
directory`. The underlying issue is that when run that way, it attempts
to execute a binary named `lldb-server-20` from its current directory.
This is also a mild security hazard because lldb-server is often being
run as root in the directory /tmp, meaning that an unprivileged user can
create the file /tmp/lldb-server-20 and lldb-server will execute it as
root. (although, well, it's a debugging server we're talking about, so
that may not be a real concern)
I haven't previously contributed to this project; if you want me to
change anything in the code please don't hesitate to let me know.
(cherry picked from commit 945c494e2c3c078e26ff521ef3e9455e0ff764ac)
---
lldb/tools/lldb-server/lldb-platform.cpp | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/lldb/tools/lldb-server/lldb-platform.cpp b/lldb/tools/lldb-server/lldb-platform.cpp
index 880b45b989b9c..51174a0f443c3 100644
--- a/lldb/tools/lldb-server/lldb-platform.cpp
+++ b/lldb/tools/lldb-server/lldb-platform.cpp
@@ -31,6 +31,7 @@
#include "Plugins/Process/gdb-remote/ProcessGDBRemoteLog.h"
#include "lldb/Host/ConnectionFileDescriptor.h"
#include "lldb/Host/HostGetOpt.h"
+#include "lldb/Host/HostInfo.h"
#include "lldb/Host/MainLoop.h"
#include "lldb/Host/OptionParser.h"
#include "lldb/Host/Socket.h"
@@ -256,8 +257,9 @@ static void client_handle(GDBRemoteCommunicationServerPlatform &platform,
printf("Disconnected.\n");
}
-static Status spawn_process(const char *progname, const Socket *conn_socket,
- uint16_t gdb_port, const lldb_private::Args &args,
+static Status spawn_process(const char *progname, const FileSpec &prog,
+ const Socket *conn_socket, uint16_t gdb_port,
+ const lldb_private::Args &args,
const std::string &log_file,
const StringRef log_channels, MainLoop &main_loop) {
Status error;
@@ -267,9 +269,10 @@ static Status spawn_process(const char *progname, const Socket *conn_socket,
ProcessLaunchInfo launch_info;
- FileSpec self_spec(progname, FileSpec::Style::native);
- launch_info.SetExecutableFile(self_spec, true);
+ launch_info.SetExecutableFile(prog, false);
+ launch_info.SetArg0(progname);
Args &self_args = launch_info.GetArguments();
+ self_args.AppendArgument(progname);
self_args.AppendArgument(llvm::StringRef("platform"));
self_args.AppendArgument(llvm::StringRef("--child-platform-fd"));
self_args.AppendArgument(llvm::to_string(shared_socket.GetSendableFD()));
@@ -551,9 +554,10 @@ int main_platform(int argc, char *argv[]) {
log_channels, &main_loop,
&platform_handles](std::unique_ptr<Socket> sock_up) {
printf("Connection established.\n");
- Status error = spawn_process(progname, sock_up.get(),
- gdbserver_port, inferior_arguments,
- log_file, log_channels, main_loop);
+ Status error = spawn_process(
+ progname, HostInfo::GetProgramFileSpec(), sock_up.get(),
+ gdbserver_port, inferior_arguments, log_file, log_channels,
+ main_loop);
if (error.Fail()) {
Log *log = GetLog(LLDBLog::Platform);
LLDB_LOGF(log, "spawn_process failed: %s", error.AsCString());
More information about the llvm-branch-commits
mailing list