]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for syscall ptrace(traceme)
authorPetar Jovanovic <mips32r2@gmail.com>
Wed, 15 Mar 2017 15:23:27 +0000 (15:23 +0000)
committerPetar Jovanovic <mips32r2@gmail.com>
Wed, 15 Mar 2017 15:23:27 +0000 (15:23 +0000)
It fixes Bug 377376.

Patch by Aleksandra Karadzic.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16273

coregrind/m_signals.c
coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-arm-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-mips32-linux.c
coregrind/m_syswrap/syswrap-mips64-linux.c
coregrind/m_syswrap/syswrap-s390x-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c
coregrind/pub_core_threadstate.h
include/vki/vki-linux.h

index 34a836e48d7182cbcfb5d09ebb4a4d4235553322..df29567a24688288fc15440ae9b5d7f21b05c6d7 100644 (file)
@@ -1667,6 +1667,7 @@ static void default_action(const vki_siginfo_t *info, ThreadId tid)
    Bool core      = False;     /* kills process w/ core */
    struct vki_rlimit corelim;
    Bool could_core;
+   ThreadState* tst = VG_(get_ThreadState)(tid);
 
    vg_assert(VG_(is_running_thread)(tid));
    
@@ -1728,6 +1729,12 @@ static void default_action(const vki_siginfo_t *info, ThreadId tid)
    if (!terminate)
       return;                  /* nothing to do */
 
+   if (terminate && (tst->ptrace & VKI_PT_PTRACED)
+       && (sigNo != VKI_SIGKILL)) {
+      VG_(kill)(VG_(getpid)(), VKI_SIGSTOP);
+      return;
+   }
+
    could_core = core;
 
    if (core) {
@@ -1746,7 +1753,6 @@ static void default_action(const vki_siginfo_t *info, ThreadId tid)
       if (VG_(clo_xml)) {
          VG_(printf_xml)("<fatal_signal>\n");
          VG_(printf_xml)("  <tid>%d</tid>\n", tid);
-         ThreadState* tst = VG_(get_ThreadState)(tid);
          if (tst->thread_name) {
             VG_(printf_xml)("  <threadname>%s</threadname>\n",
                             tst->thread_name);
index 06ea7cde68bedffcc3a07db08ee56991bdd411aa..2900bdda8d35da6c1bce3a68814830f7d541e51a 100644 (file)
@@ -318,6 +318,7 @@ extern void ML_(linux_POST_sys_sendmmsg)   ( TId, UW, UW, UW, UW, UW );
 // Linux-specific (but non-arch-specific) ptrace wrapper helpers
 extern void ML_(linux_PRE_getregset) ( ThreadId, long, long );
 extern void ML_(linux_PRE_setregset) ( ThreadId, long, long );
+extern void ML_(linux_POST_traceme)  ( ThreadId );
 extern void ML_(linux_POST_getregset)( ThreadId, long, long );
 
 #undef TId
index 3fe993825effe191d0f8d0ce8e0751f55b97b8f4..c338fade1196e6d81025fca737631963b6523067 100644 (file)
@@ -349,6 +349,9 @@ PRE(sys_ptrace)
 POST(sys_ptrace)
 {
    switch (ARG1) {
+   case VKI_PTRACE_TRACEME:
+         ML_(linux_POST_traceme)(tid);
+         break;
    case VKI_PTRACE_PEEKTEXT:
    case VKI_PTRACE_PEEKDATA:
    case VKI_PTRACE_PEEKUSR:
index b417428d67be992ae250b1e3dbcff27e3750cc83..5ac2ceddb337a9dfcee6f941f1217e6e2cb52597 100644 (file)
@@ -482,6 +482,9 @@ PRE(sys_ptrace)
 POST(sys_ptrace)
 {
    switch (ARG1) {
+   case VKI_PTRACE_TRACEME:
+      ML_(linux_POST_traceme)(tid);
+      break;
    case VKI_PTRACE_PEEKTEXT:
    case VKI_PTRACE_PEEKDATA:
    case VKI_PTRACE_PEEKUSR:
index bd6c3f2cca691222b47c2bd4c03e32209235db1b..5a79930aa36ce6e6e85eaf3c8763b5604f1d2c46 100644 (file)
@@ -11100,6 +11100,13 @@ ML_(linux_POST_sys_sendmmsg) (ThreadId tid, UWord res,
    ptrace wrapper helpers
    ------------------------------------------------------------------ */
 
+void
+ML_(linux_POST_traceme) ( ThreadId tid )
+{
+  ThreadState *tst = VG_(get_ThreadState)(tid);
+  tst->ptrace = VKI_PT_PTRACED;
+}
+
 void
 ML_(linux_PRE_getregset) ( ThreadId tid, long arg3, long arg4 )
 {
index 652e593ce3a41d56a194e70dd77506bcabc334a8..f5cbf50726a9aa577a33d5c325d10659317a9406 100644 (file)
@@ -471,6 +471,9 @@ PRE(sys_ptrace)
 POST(sys_ptrace)
 {
    switch (ARG1) {
+      case VKI_PTRACE_TRACEME:
+         ML_(linux_POST_traceme)(tid);
+         break;
       case VKI_PTRACE_PEEKTEXT:
       case VKI_PTRACE_PEEKDATA:
       case VKI_PTRACE_PEEKUSR:
index d3d70c5f417f3664d9b9989581d180016d36bdb3..ce33a5180551f8e7c7c9101f2ae3ed798801652e 100644 (file)
@@ -365,6 +365,9 @@ PRE(sys_ptrace)
 POST(sys_ptrace)
 {
    switch (ARG1) {
+      case VKI_PTRACE_TRACEME:
+         ML_(linux_POST_traceme)(tid);
+         break;
       case VKI_PTRACE_PEEKTEXT:
       case VKI_PTRACE_PEEKDATA:
       case VKI_PTRACE_PEEKUSR:
index f59634124bf86e2f0d59676aef6422c9a7896c66..9bbe9a3f68928261286ed3f194f7baed79167683 100644 (file)
@@ -271,6 +271,9 @@ PRE(sys_ptrace)
 POST(sys_ptrace)
 {
    switch (ARG1) {
+   case VKI_PTRACE_TRACEME:
+      ML_(linux_POST_traceme)(tid);
+      break;
    case VKI_PTRACE_PEEKTEXT:
    case VKI_PTRACE_PEEKDATA:
    case VKI_PTRACE_PEEKUSR:
index 2f879d8401f3adb2af32846b7ce9cad9a1527c6f..8c74d0426a17c72a6ffbc9de6c7fc49284bd5a7e 100644 (file)
@@ -900,6 +900,9 @@ PRE(sys_ptrace)
 POST(sys_ptrace)
 {
    switch (ARG1) {
+   case VKI_PTRACE_TRACEME:
+      ML_(linux_POST_traceme)(tid);
+      break;
    case VKI_PTRACE_PEEKTEXT:
    case VKI_PTRACE_PEEKDATA:
    case VKI_PTRACE_PEEKUSR:
index 3307e758773770fba42f81993e96600f27b3d76c..71bb97c06edaf59b3a64154262432c5a3436e0d8 100644 (file)
@@ -407,6 +407,7 @@ typedef struct {
 
    /* This thread's name. NULL, if no name. */
    HChar *thread_name;
+   UInt ptrace;
 }
 ThreadState;
 
index f70be844bf5d5748c62e297a200d8aa9c1287e6d..fd3d7584a0485f2a0e653fc4b83d7d9d4a416222 100644 (file)
@@ -2324,6 +2324,8 @@ typedef __vki_kernel_uid32_t vki_qid_t; /* Type in which we store ids in memory
 #define VKI_PTRACE_GETREGSET   0x4204
 #define VKI_PTRACE_SETREGSET   0x4205
 
+#define VKI_PT_PTRACED 0x00000001
+
 //----------------------------------------------------------------------
 // From linux-2.6.14/include/sound/asound.h
 //----------------------------------------------------------------------