Add support for syscall ptrace(traceme)

It fixes Bug 377376.

Patch by Aleksandra Karadzic.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16273
This commit is contained in:
Petar Jovanovic 2017-03-15 15:23:27 +00:00
parent 85075802b2
commit 30717ab5a2
11 changed files with 36 additions and 1 deletions

View 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);

View 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

View 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:

View 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:

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

View 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:

View 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:

View 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:

View 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:

View File

@ -407,6 +407,7 @@ typedef struct {
/* This thread's name. NULL, if no name. */
HChar *thread_name;
UInt ptrace;
}
ThreadState;

View 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
//----------------------------------------------------------------------