Author: David CARLIER Date: 2024-02-11T08:17:53Z New Revision: 535da10842c7309e9eeaf9828cf6bb034fecaf16
URL: https://github.com/llvm/llvm-project/commit/535da10842c7309e9eeaf9828cf6bb034fecaf16 DIFF: https://github.com/llvm/llvm-project/commit/535da10842c7309e9eeaf9828cf6bb034fecaf16.diff LOG: [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 Added: Modified: lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp index 19e0986ace31ff..9c620e4807e344 100644 --- a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp +++ b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp @@ -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) { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits