forked from OSchip/llvm-project
[lldb] Prevent 'process connect' from using local-only plugins
Add a 'can_connect' parameter to Process plugin initialization, and use it to filter plugins to these capable of remote connections. This is used to prevent 'process connect' from picking up a plugin that can only be used locally, e.g. the legacy FreeBSD plugin. Differential Revision: https://reviews.llvm.org/D91810
This commit is contained in:
parent
66ace4dc02
commit
18e4272a4f
|
@ -537,7 +537,8 @@ public:
|
|||
static lldb::ProcessSP FindPlugin(lldb::TargetSP target_sp,
|
||||
llvm::StringRef plugin_name,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path);
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
/// Static function that can be used with the \b host function
|
||||
/// Host::StartMonitoringChildProcess ().
|
||||
|
|
|
@ -77,7 +77,8 @@ protected:
|
|||
private:
|
||||
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path);
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
};
|
||||
|
||||
} // namespace lldb_private
|
||||
|
|
|
@ -573,7 +573,8 @@ public:
|
|||
// used.
|
||||
const lldb::ProcessSP &CreateProcess(lldb::ListenerSP listener_sp,
|
||||
llvm::StringRef plugin_name,
|
||||
const FileSpec *crash_file);
|
||||
const FileSpec *crash_file,
|
||||
bool can_connect);
|
||||
|
||||
const lldb::ProcessSP &GetProcessSP() const;
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ typedef lldb::PlatformSP (*PlatformCreateInstance)(bool force,
|
|||
const ArchSpec *arch);
|
||||
typedef lldb::ProcessSP (*ProcessCreateInstance)(
|
||||
lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path);
|
||||
const FileSpec *crash_file_path, bool can_connect);
|
||||
typedef lldb::ScriptInterpreterSP (*ScriptInterpreterCreateInstance)(
|
||||
Debugger &debugger);
|
||||
typedef SymbolFile *(*SymbolFileCreateInstance)(lldb::ObjectFileSP objfile_sp);
|
||||
|
|
|
@ -267,7 +267,7 @@ SBProcess SBTarget::LoadCore(const char *core_file, lldb::SBError &error) {
|
|||
FileSpec filespec(core_file);
|
||||
FileSystem::Instance().Resolve(filespec);
|
||||
ProcessSP process_sp(target_sp->CreateProcess(
|
||||
target_sp->GetDebugger().GetListener(), "", &filespec));
|
||||
target_sp->GetDebugger().GetListener(), "", &filespec, false));
|
||||
if (process_sp) {
|
||||
error.SetError(process_sp->LoadCore());
|
||||
if (error.Success())
|
||||
|
@ -567,10 +567,11 @@ lldb::SBProcess SBTarget::ConnectRemote(SBListener &listener, const char *url,
|
|||
std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
|
||||
if (listener.IsValid())
|
||||
process_sp =
|
||||
target_sp->CreateProcess(listener.m_opaque_sp, plugin_name, nullptr);
|
||||
target_sp->CreateProcess(listener.m_opaque_sp, plugin_name, nullptr,
|
||||
true);
|
||||
else
|
||||
process_sp = target_sp->CreateProcess(
|
||||
target_sp->GetDebugger().GetListener(), plugin_name, nullptr);
|
||||
target_sp->GetDebugger().GetListener(), plugin_name, nullptr, true);
|
||||
|
||||
if (process_sp) {
|
||||
sb_process.SetSP(process_sp);
|
||||
|
|
|
@ -401,7 +401,8 @@ protected:
|
|||
target_sp->AppendExecutableSearchPaths(core_file_dir);
|
||||
|
||||
ProcessSP process_sp(target_sp->CreateProcess(
|
||||
GetDebugger().GetListener(), llvm::StringRef(), &core_file));
|
||||
GetDebugger().GetListener(), llvm::StringRef(), &core_file,
|
||||
false));
|
||||
|
||||
if (process_sp) {
|
||||
// Seems weird that we Launch a core file, but that is what we
|
||||
|
|
|
@ -388,7 +388,8 @@ lldb::ProcessSP PlatformPOSIX::Attach(ProcessAttachInfo &attach_info,
|
|||
|
||||
process_sp =
|
||||
target->CreateProcess(attach_info.GetListenerForProcess(debugger),
|
||||
attach_info.GetProcessPluginName(), nullptr);
|
||||
attach_info.GetProcessPluginName(), nullptr,
|
||||
false);
|
||||
|
||||
if (process_sp) {
|
||||
ListenerSP listener_sp = attach_info.GetHijackListener();
|
||||
|
@ -468,7 +469,8 @@ PlatformPOSIX::DebugProcess(ProcessLaunchInfo &launch_info, Debugger &debugger,
|
|||
// Now create the gdb-remote process.
|
||||
LLDB_LOG(log, "having target create process with gdb-remote plugin");
|
||||
process_sp =
|
||||
target->CreateProcess(launch_info.GetListener(), "gdb-remote", nullptr);
|
||||
target->CreateProcess(launch_info.GetListener(), "gdb-remote", nullptr,
|
||||
true);
|
||||
|
||||
if (!process_sp) {
|
||||
error.SetErrorString("CreateProcess() failed for gdb-remote process");
|
||||
|
|
|
@ -233,7 +233,8 @@ ProcessSP PlatformWindows::DebugProcess(ProcessLaunchInfo &launch_info,
|
|||
return Attach(attach_info, debugger, target, error);
|
||||
} else {
|
||||
ProcessSP process_sp = target->CreateProcess(
|
||||
launch_info.GetListener(), launch_info.GetProcessPluginName(), nullptr);
|
||||
launch_info.GetListener(), launch_info.GetProcessPluginName(), nullptr,
|
||||
false);
|
||||
|
||||
// We need to launch and attach to the process.
|
||||
launch_info.GetFlags().Set(eLaunchFlagDebug);
|
||||
|
@ -275,7 +276,7 @@ lldb::ProcessSP PlatformWindows::Attach(ProcessAttachInfo &attach_info,
|
|||
|
||||
const char *plugin_name = attach_info.GetProcessPluginName();
|
||||
process_sp = target->CreateProcess(
|
||||
attach_info.GetListenerForProcess(debugger), plugin_name, nullptr);
|
||||
attach_info.GetListenerForProcess(debugger), plugin_name, nullptr, false);
|
||||
|
||||
process_sp->HijackProcessEvents(attach_info.GetHijackListener());
|
||||
if (process_sp)
|
||||
|
|
|
@ -500,7 +500,7 @@ lldb::ProcessSP PlatformRemoteGDBServer::DebugProcess(
|
|||
// The darwin always currently uses the GDB remote debugger plug-in
|
||||
// so even when debugging locally we are debugging remotely!
|
||||
process_sp = target->CreateProcess(launch_info.GetListener(),
|
||||
"gdb-remote", nullptr);
|
||||
"gdb-remote", nullptr, true);
|
||||
|
||||
if (process_sp) {
|
||||
error = process_sp->ConnectRemote(connect_url.c_str());
|
||||
|
@ -587,7 +587,7 @@ lldb::ProcessSP PlatformRemoteGDBServer::Attach(
|
|||
// so even when debugging locally we are debugging remotely!
|
||||
process_sp =
|
||||
target->CreateProcess(attach_info.GetListenerForProcess(debugger),
|
||||
"gdb-remote", nullptr);
|
||||
"gdb-remote", nullptr, true);
|
||||
if (process_sp) {
|
||||
error = process_sp->ConnectRemote(connect_url.c_str());
|
||||
if (error.Success()) {
|
||||
|
|
|
@ -70,9 +70,10 @@ UnixSignalsSP &GetFreeBSDSignals() {
|
|||
lldb::ProcessSP
|
||||
ProcessFreeBSD::CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path) {
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect) {
|
||||
lldb::ProcessSP process_sp;
|
||||
if (crash_file_path == NULL)
|
||||
if (crash_file_path == NULL && !can_connect)
|
||||
process_sp.reset(
|
||||
new ProcessFreeBSD(target_sp, listener_sp, GetFreeBSDSignals()));
|
||||
return process_sp;
|
||||
|
|
|
@ -26,7 +26,8 @@ public:
|
|||
// Static functions.
|
||||
static lldb::ProcessSP
|
||||
CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const lldb_private::FileSpec *crash_file_path);
|
||||
const lldb_private::FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -111,7 +111,8 @@ void ProcessKDP::Terminate() {
|
|||
|
||||
lldb::ProcessSP ProcessKDP::CreateInstance(TargetSP target_sp,
|
||||
ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path) {
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect) {
|
||||
lldb::ProcessSP process_sp;
|
||||
if (crash_file_path == NULL)
|
||||
process_sp = std::make_shared<ProcessKDP>(target_sp, listener_sp);
|
||||
|
|
|
@ -32,7 +32,8 @@ public:
|
|||
// Constructors and Destructors
|
||||
static lldb::ProcessSP
|
||||
CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const lldb_private::FileSpec *crash_file_path);
|
||||
const lldb_private::FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -79,7 +79,8 @@ namespace lldb_private {
|
|||
|
||||
ProcessSP ProcessWindows::CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *) {
|
||||
const FileSpec *,
|
||||
bool can_connect) {
|
||||
return ProcessSP(new ProcessWindows(target_sp, listener_sp));
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,8 @@ public:
|
|||
// Static functions.
|
||||
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *);
|
||||
const FileSpec *,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -52,9 +52,10 @@ void ProcessElfCore::Terminate() {
|
|||
|
||||
lldb::ProcessSP ProcessElfCore::CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file) {
|
||||
const FileSpec *crash_file,
|
||||
bool can_connect) {
|
||||
lldb::ProcessSP process_sp;
|
||||
if (crash_file) {
|
||||
if (crash_file && !can_connect) {
|
||||
// Read enough data for a ELF32 header or ELF64 header Note: Here we care
|
||||
// about e_type field only, so it is safe to ignore possible presence of
|
||||
// the header extension.
|
||||
|
|
|
@ -33,7 +33,8 @@ public:
|
|||
// Constructors and Destructors
|
||||
static lldb::ProcessSP
|
||||
CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
|
||||
const lldb_private::FileSpec *crash_file_path);
|
||||
const lldb_private::FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -205,7 +205,8 @@ void ProcessGDBRemote::Terminate() {
|
|||
lldb::ProcessSP
|
||||
ProcessGDBRemote::CreateInstance(lldb::TargetSP target_sp,
|
||||
ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path) {
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect) {
|
||||
lldb::ProcessSP process_sp;
|
||||
if (crash_file_path == nullptr)
|
||||
process_sp = std::make_shared<ProcessGDBRemote>(target_sp, listener_sp);
|
||||
|
|
|
@ -55,7 +55,8 @@ public:
|
|||
|
||||
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path);
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -61,9 +61,10 @@ void ProcessMachCore::Terminate() {
|
|||
|
||||
lldb::ProcessSP ProcessMachCore::CreateInstance(lldb::TargetSP target_sp,
|
||||
ListenerSP listener_sp,
|
||||
const FileSpec *crash_file) {
|
||||
const FileSpec *crash_file,
|
||||
bool can_connect) {
|
||||
lldb::ProcessSP process_sp;
|
||||
if (crash_file) {
|
||||
if (crash_file && !can_connect) {
|
||||
const size_t header_size = sizeof(llvm::MachO::mach_header);
|
||||
auto data_sp = FileSystem::Instance().CreateDataBuffer(
|
||||
crash_file->GetPath(), header_size, 0);
|
||||
|
|
|
@ -28,7 +28,8 @@ public:
|
|||
|
||||
static lldb::ProcessSP
|
||||
CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener,
|
||||
const lldb_private::FileSpec *crash_file_path);
|
||||
const lldb_private::FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -200,8 +200,9 @@ const char *ProcessMinidump::GetPluginDescriptionStatic() {
|
|||
|
||||
lldb::ProcessSP ProcessMinidump::CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file) {
|
||||
if (!crash_file)
|
||||
const FileSpec *crash_file,
|
||||
bool can_connect) {
|
||||
if (!crash_file || can_connect)
|
||||
return nullptr;
|
||||
|
||||
lldb::ProcessSP process_sp;
|
||||
|
|
|
@ -30,7 +30,8 @@ class ProcessMinidump : public PostMortemProcess {
|
|||
public:
|
||||
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
|
||||
lldb::ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path);
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect);
|
||||
|
||||
static void Initialize();
|
||||
|
||||
|
|
|
@ -1834,7 +1834,7 @@ lldb::ProcessSP Platform::DoConnectProcess(llvm::StringRef connect_url,
|
|||
debugger.GetTargetList().SetSelectedTarget(target);
|
||||
|
||||
lldb::ProcessSP process_sp =
|
||||
target->CreateProcess(debugger.GetListener(), plugin_name, nullptr);
|
||||
target->CreateProcess(debugger.GetListener(), plugin_name, nullptr, true);
|
||||
|
||||
if (!process_sp)
|
||||
return nullptr;
|
||||
|
|
|
@ -479,7 +479,8 @@ llvm::ArrayRef<OptionDefinition> ProcessLaunchCommandOptions::GetDefinitions() {
|
|||
ProcessSP Process::FindPlugin(lldb::TargetSP target_sp,
|
||||
llvm::StringRef plugin_name,
|
||||
ListenerSP listener_sp,
|
||||
const FileSpec *crash_file_path) {
|
||||
const FileSpec *crash_file_path,
|
||||
bool can_connect) {
|
||||
static uint32_t g_process_unique_id = 0;
|
||||
|
||||
ProcessSP process_sp;
|
||||
|
@ -489,7 +490,8 @@ ProcessSP Process::FindPlugin(lldb::TargetSP target_sp,
|
|||
create_callback =
|
||||
PluginManager::GetProcessCreateCallbackForPluginName(const_plugin_name);
|
||||
if (create_callback) {
|
||||
process_sp = create_callback(target_sp, listener_sp, crash_file_path);
|
||||
process_sp = create_callback(target_sp, listener_sp, crash_file_path,
|
||||
can_connect);
|
||||
if (process_sp) {
|
||||
if (process_sp->CanDebug(target_sp, true)) {
|
||||
process_sp->m_process_unique_id = ++g_process_unique_id;
|
||||
|
@ -502,7 +504,8 @@ ProcessSP Process::FindPlugin(lldb::TargetSP target_sp,
|
|||
(create_callback =
|
||||
PluginManager::GetProcessCreateCallbackAtIndex(idx)) != nullptr;
|
||||
++idx) {
|
||||
process_sp = create_callback(target_sp, listener_sp, crash_file_path);
|
||||
process_sp = create_callback(target_sp, listener_sp, crash_file_path,
|
||||
can_connect);
|
||||
if (process_sp) {
|
||||
if (process_sp->CanDebug(target_sp, false)) {
|
||||
process_sp->m_process_unique_id = ++g_process_unique_id;
|
||||
|
|
|
@ -34,7 +34,10 @@ void ProcessTrace::Terminate() {
|
|||
|
||||
ProcessSP ProcessTrace::CreateInstance(TargetSP target_sp,
|
||||
ListenerSP listener_sp,
|
||||
const FileSpec *crash_file) {
|
||||
const FileSpec *crash_file,
|
||||
bool can_connect) {
|
||||
if (can_connect)
|
||||
return nullptr;
|
||||
return std::make_shared<ProcessTrace>(target_sp, listener_sp);
|
||||
}
|
||||
|
||||
|
|
|
@ -199,12 +199,13 @@ void Target::DeleteCurrentProcess() {
|
|||
|
||||
const lldb::ProcessSP &Target::CreateProcess(ListenerSP listener_sp,
|
||||
llvm::StringRef plugin_name,
|
||||
const FileSpec *crash_file) {
|
||||
const FileSpec *crash_file,
|
||||
bool can_connect) {
|
||||
if (!listener_sp)
|
||||
listener_sp = GetDebugger().GetListener();
|
||||
DeleteCurrentProcess();
|
||||
m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name,
|
||||
listener_sp, crash_file);
|
||||
listener_sp, crash_file, can_connect);
|
||||
return m_process_sp;
|
||||
}
|
||||
|
||||
|
@ -2975,7 +2976,7 @@ Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) {
|
|||
} else {
|
||||
// Use a Process plugin to construct the process.
|
||||
const char *plugin_name = launch_info.GetProcessPluginName();
|
||||
CreateProcess(launch_info.GetListener(), plugin_name, nullptr);
|
||||
CreateProcess(launch_info.GetListener(), plugin_name, nullptr, false);
|
||||
}
|
||||
|
||||
// Since we didn't have a platform launch the process, launch it here.
|
||||
|
@ -3103,7 +3104,7 @@ Status Target::Attach(ProcessAttachInfo &attach_info, Stream *stream) {
|
|||
const char *plugin_name = attach_info.GetProcessPluginName();
|
||||
process_sp =
|
||||
CreateProcess(attach_info.GetListenerForProcess(GetDebugger()),
|
||||
plugin_name, nullptr);
|
||||
plugin_name, nullptr, false);
|
||||
if (process_sp == nullptr) {
|
||||
error.SetErrorStringWithFormat(
|
||||
"failed to create process using plugin %s",
|
||||
|
|
|
@ -127,7 +127,8 @@ TraceSessionFileParser::ParseProcess(const JSONProcess &process) {
|
|||
|
||||
ProcessSP process_sp = target_sp->CreateProcess(
|
||||
/*listener*/ nullptr, "trace",
|
||||
/*crash_file*/ nullptr);
|
||||
/*crash_file*/ nullptr,
|
||||
/*can_connect*/ false);
|
||||
|
||||
process_sp->SetID(static_cast<lldb::pid_t>(process.pid));
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@ class TestProcessConnect(GDBRemoteTestBase):
|
|||
|
||||
NO_DEBUG_INFO_TESTCASE = True
|
||||
|
||||
@skipIfWindows
|
||||
def test_gdb_remote_sync(self):
|
||||
"""Test the gdb-remote command in synchronous mode"""
|
||||
try:
|
||||
|
@ -21,7 +20,6 @@ class TestProcessConnect(GDBRemoteTestBase):
|
|||
finally:
|
||||
self.dbg.GetSelectedPlatform().DisconnectRemote()
|
||||
|
||||
@skipIfWindows
|
||||
@skipIfReproducer # Reproducer don't support async.
|
||||
def test_gdb_remote_async(self):
|
||||
"""Test the gdb-remote command in asynchronous mode"""
|
||||
|
@ -35,8 +33,6 @@ class TestProcessConnect(GDBRemoteTestBase):
|
|||
finally:
|
||||
self.dbg.GetSelectedPlatform().DisconnectRemote()
|
||||
|
||||
@skipIfWindows
|
||||
@expectedFailureAll(oslist=["freebsd"])
|
||||
def test_process_connect_sync(self):
|
||||
"""Test the gdb-remote command in synchronous mode"""
|
||||
try:
|
||||
|
@ -47,8 +43,6 @@ class TestProcessConnect(GDBRemoteTestBase):
|
|||
finally:
|
||||
self.dbg.GetSelectedPlatform().DisconnectRemote()
|
||||
|
||||
@skipIfWindows
|
||||
@expectedFailureAll(oslist=["freebsd"])
|
||||
@skipIfReproducer # Reproducer don't support async.
|
||||
def test_process_connect_async(self):
|
||||
"""Test the gdb-remote command in asynchronous mode"""
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
# UNSUPPORTED: system-windows
|
||||
# XFAIL: system-freebsd
|
||||
|
||||
# Synchronous
|
||||
# RUN: %lldb -o 'platform select remote-gdb-server' -o 'process connect connect://localhost:4321' 2>&1 | FileCheck %s
|
||||
|
||||
|
|
Loading…
Reference in New Issue