From: Petar Jovanovic Date: Wed, 15 Mar 2017 15:23:27 +0000 (+0000) Subject: Add support for syscall ptrace(traceme) X-Git-Tag: svn/VALGRIND_3_13_0~154 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30717ab5a2ace80bc80e60afc1c622dcde91346a;p=thirdparty%2Fvalgrind.git Add support for syscall ptrace(traceme) It fixes Bug 377376. Patch by Aleksandra Karadzic. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16273 --- diff --git a/coregrind/m_signals.c b/coregrind/m_signals.c index 34a836e48d..df29567a24 100644 --- a/coregrind/m_signals.c +++ b/coregrind/m_signals.c @@ -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)("\n"); VG_(printf_xml)(" %d\n", tid); - ThreadState* tst = VG_(get_ThreadState)(tid); if (tst->thread_name) { VG_(printf_xml)(" %s\n", tst->thread_name); diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 06ea7cde68..2900bdda8d 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -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 diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 3fe993825e..c338fade11 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -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: diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index b417428d67..5ac2ceddb3 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -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: diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index bd6c3f2cca..5a79930aa3 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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 ) { diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index 652e593ce3..f5cbf50726 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -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: diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index d3d70c5f41..ce33a51805 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -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: diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index f59634124b..9bbe9a3f68 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -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: diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 2f879d8401..8c74d0426a 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -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: diff --git a/coregrind/pub_core_threadstate.h b/coregrind/pub_core_threadstate.h index 3307e75877..71bb97c06e 100644 --- a/coregrind/pub_core_threadstate.h +++ b/coregrind/pub_core_threadstate.h @@ -407,6 +407,7 @@ typedef struct { /* This thread's name. NULL, if no name. */ HChar *thread_name; + UInt ptrace; } ThreadState; diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index f70be844bf..fd3d7584a0 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 //----------------------------------------------------------------------