lkml.org 
[lkml]   [2007]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] prevent sending wrong signals to a traced process whose tracer gets killed
    From
    Date
    Hi,

    I experienced troubles when tracing a process with strace. Sometimes,
    when I killed the strace process (SIGKILL), the traced process was also
    killed. I found out that it was getting SIGTRAP and, indeed, when the
    traced process set up a signal handler for SIGTRAP, it no longer died.

    I noticed that normally, when the traced process is continued (via
    PTRACE_CONT or similar), the signal to be sent to it is stored in
    current->exit_code, which is then examined by the arch-specific code and
    usually leads to something like:

    send_sig(current->exit_code, current, 1);

    The exit_code is set in ptrace_stop(), but the tracing process may go
    away while the traced process waits for it, and in that case exit_code
    is left as-is. I think we must set it to zero in ptrace_untrace().

    Signed-off-by: Petr Tesarik <ptesarik@suse.cz>

    ptrace.c | 1 +
    1 file changed, 1 insertion(+)

    diff -pru a/kernel/ptrace.c b/kernel/ptrace.c
    --- a/kernel/ptrace.c 2007-12-04 14:12:51.000000000 +0100
    +++ b/kernel/ptrace.c 2007-12-04 14:13:28.000000000 +0100
    @@ -52,6 +52,7 @@ void ptrace_untrace(struct task_struct *
    {
    spin_lock(&child->sighand->siglock);
    if (child->state == TASK_TRACED) {
    + child->exit_code = 0;
    if (child->signal->flags & SIGNAL_STOP_STOPPED) {
    child->state = TASK_STOPPED;
    } else {


    \
     
     \ /
      Last update: 2007-12-04 14:31    [W:2.564 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site