[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:
David CARLIER 2024-02-11 08:17:53 +00:00 committed by GitHub
parent ab2cef5391
commit 535da10842
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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) {