mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-19 02:56:49 +00:00
[lldb] checks if lldb can trace/attach/set a breakpoint a process or load a file to debug on FreeBSD.
before having the generic EINVAL message, we check if the `security.bsd.unprivileged_proc_debug` allows process debugging. close #79634
This commit is contained in:
parent
ab2cef5391
commit
535da10842
@ -48,20 +48,38 @@ static Status EnsureFDFlags(int fd, int flags) {
|
||||
return error;
|
||||
}
|
||||
|
||||
static Status CanTrace() {
|
||||
int proc_debug, ret;
|
||||
size_t len = sizeof(proc_debug);
|
||||
ret = ::sysctlbyname("security.bsd.unprivileged_proc_debug", &proc_debug,
|
||||
&len, nullptr, 0);
|
||||
if (ret != 0)
|
||||
return Status("sysctlbyname() security.bsd.unprivileged_proc_debug failed");
|
||||
|
||||
if (proc_debug < 1)
|
||||
return Status(
|
||||
"process debug disabled by security.bsd.unprivileged_proc_debug oid");
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
// Public Static Methods
|
||||
|
||||
llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
|
||||
NativeProcessFreeBSD::Manager::Launch(ProcessLaunchInfo &launch_info,
|
||||
NativeDelegate &native_delegate) {
|
||||
Log *log = GetLog(POSIXLog::Process);
|
||||
|
||||
Status status;
|
||||
|
||||
::pid_t pid = ProcessLauncherPosixFork()
|
||||
.LaunchProcess(launch_info, status)
|
||||
.GetProcessId();
|
||||
LLDB_LOG(log, "pid = {0:x}", pid);
|
||||
if (status.Fail()) {
|
||||
auto error = CanTrace();
|
||||
LLDB_LOG(log, "failed to launch process: {0}", status);
|
||||
if (status.Fail())
|
||||
return error.ToError();
|
||||
return status.ToError();
|
||||
}
|
||||
|
||||
@ -392,8 +410,11 @@ Status NativeProcessFreeBSD::PtraceWrapper(int req, lldb::pid_t pid, void *addr,
|
||||
ret =
|
||||
ptrace(req, static_cast<::pid_t>(pid), static_cast<caddr_t>(addr), data);
|
||||
|
||||
if (ret == -1)
|
||||
error.SetErrorToErrno();
|
||||
if (ret == -1) {
|
||||
error = CanTrace();
|
||||
if (error.Success())
|
||||
error.SetErrorToErrno();
|
||||
}
|
||||
|
||||
if (result)
|
||||
*result = ret;
|
||||
@ -707,8 +728,12 @@ Status NativeProcessFreeBSD::SetBreakpoint(lldb::addr_t addr, uint32_t size,
|
||||
Status NativeProcessFreeBSD::GetLoadedModuleFileSpec(const char *module_path,
|
||||
FileSpec &file_spec) {
|
||||
Status error = PopulateMemoryRegionCache();
|
||||
if (error.Fail())
|
||||
if (error.Fail()) {
|
||||
auto status = CanTrace();
|
||||
if (status.Fail())
|
||||
return status;
|
||||
return error;
|
||||
}
|
||||
|
||||
FileSpec module_file_spec(module_path);
|
||||
FileSystem::Instance().Resolve(module_file_spec);
|
||||
@ -729,8 +754,12 @@ NativeProcessFreeBSD::GetFileLoadAddress(const llvm::StringRef &file_name,
|
||||
lldb::addr_t &load_addr) {
|
||||
load_addr = LLDB_INVALID_ADDRESS;
|
||||
Status error = PopulateMemoryRegionCache();
|
||||
if (error.Fail())
|
||||
if (error.Fail()) {
|
||||
auto status = CanTrace();
|
||||
if (status.Fail())
|
||||
return status;
|
||||
return error;
|
||||
}
|
||||
|
||||
FileSpec file(file_name);
|
||||
for (const auto &it : m_mem_region_cache) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user