llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: David CARLIER (devnexen)

<details>
<summary>Changes</summary>

before having the generic EINVAL message, we check if the 
`security.bsd.unprivileged_proc_debug` allows process debugging.

close #<!-- -->79634

---
Full diff: https://github.com/llvm/llvm-project/pull/79662.diff


1 Files Affected:

- (modified) lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp 
(+28-1) 


``````````diff
diff --git a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp 
b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
index 19e0986ace31ff6..7540ba296517821 100644
--- a/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD/NativeProcessFreeBSD.cpp
@@ -48,14 +48,37 @@ static Status EnsureFDFlags(int fd, int flags) {
   return error;
 }
 
+static Status CanTrace() {
+  Status status;
+  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 status;
+}
+
 // 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;
+
+  status = CanTrace();
+
+  if (status.Fail()) {
+    LLDB_LOG(log, "failed to launch process: {0}", status);
+    return status.ToError();
+  }
+
   ::pid_t pid = ProcessLauncherPosixFork()
                     .LaunchProcess(launch_info, status)
                     .GetProcessId();
@@ -388,6 +411,10 @@ Status NativeProcessFreeBSD::PtraceWrapper(int req, 
lldb::pid_t pid, void *addr,
   Status error;
   int ret;
 
+  error = CanTrace();
+  if (error.Fail())
+    return error;
+
   errno = 0;
   ret =
       ptrace(req, static_cast<::pid_t>(pid), static_cast<caddr_t>(addr), data);

``````````

</details>


https://github.com/llvm/llvm-project/pull/79662
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to