Some Linux kernels have a ptrace security feature that prevents a ptracer from 
attaching to the inferior if the ptracer is not an ancestor in the process 
hierarchy.  In the gdb-remote attach tests, the llgs is not a parent of the 
inferior, so kernels that protect against this are failing on the attach tests.

This change to the inferior test program checks if the inferior is running on 
Linux and has the relevant ptrace flags, and if so, first thing enables a 
ptracer that is not part of the parent hierarchy.

http://reviews.llvm.org/D5846

Files:
  test/tools/lldb-gdbserver/main.cpp
Index: test/tools/lldb-gdbserver/main.cpp
===================================================================
--- test/tools/lldb-gdbserver/main.cpp
+++ test/tools/lldb-gdbserver/main.cpp
@@ -20,6 +20,10 @@
 #include <sys/syscall.h>
 #endif
 
+#if defined(__linux__)
+#include <sys/prctl.h>
+#endif
+
 static const char *const RETVAL_PREFIX               = "retval:";
 static const char *const SLEEP_PREFIX                = "sleep:";
 static const char *const STDERR_PREFIX               = "stderr:";
@@ -206,6 +210,17 @@
 
 int main (int argc, char **argv)
 {
+#if defined(__linux__)
+    // Immediately enable any ptracer so that we can allow the stub attach
+    // operation to succeed.  Some Linux kernels are locked down so that
+    // only an ancestor can be a ptracer of a process.  This disables that
+    // restriction.  Without it, attach-related stub tests will fail.
+#if defined(PR_SET_PTRACER) && defined(PR_SET_PTRACER_ANY)
+    const int prctl_result = prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
+    static_cast<void> (prctl_result);
+#endif
+#endif
+
 	std::vector<pthread_t> threads;
 	std::unique_ptr<uint8_t[]> heap_array_up;
     int return_value = 0;
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to