lkml.org 
[lkml]   [2008]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/23] tracehook: tracehook_consider_fatal_signal
    Date
    This defines tracehook_consider_fatal_signal() has a fine-grained
    hook for deciding to skip the special cases for a fatal signal,
    as ptrace does. There is no change, only cleanup.

    Signed-off-by: Roland McGrath <roland@redhat.com>
    ---
    include/linux/tracehook.h | 21 +++++++++++++++++++++
    kernel/signal.c | 9 +++++----
    2 files changed, 26 insertions(+), 4 deletions(-)

    diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
    index 8cffd34..8b4c15e 100644
    --- a/include/linux/tracehook.h
    +++ b/include/linux/tracehook.h
    @@ -331,4 +331,25 @@ static inline int tracehook_consider_ignored_signal(struct task_struct *task,
    return (task_ptrace(task) & PT_PTRACED) != 0;
    }

    +/**
    + * tracehook_consider_fatal_signal - suppress special handling of fatal signal
    + * @task: task receiving the signal
    + * @sig: signal number being sent
    + * @handler: %SIG_DFL or %SIG_IGN
    + *
    + * Return nonzero to prevent special handling of this termination signal.
    + * Normally @handler is %SIG_DFL. It can be %SIG_IGN if @sig is ignored,
    + * in which case force_sig() is about to reset it to %SIG_DFL.
    + * When this returns zero, this signal might cause a quick termination
    + * that does not give the debugger a chance to intercept the signal.
    + *
    + * Called with or without @task->sighand->siglock held.
    + */
    +static inline int tracehook_consider_fatal_signal(struct task_struct *task,
    + int sig,
    + void __user *handler)
    +{
    + return (task_ptrace(task) & PT_PTRACED) != 0;
    +}
    +
    #endif /* <linux/tracehook.h> */
    diff --git a/kernel/signal.c b/kernel/signal.c
    index f68fb01..860afb8 100644
    --- a/kernel/signal.c
    +++ b/kernel/signal.c
    @@ -300,12 +300,12 @@ flush_signal_handlers(struct task_struct *t, int force_default)

    int unhandled_signal(struct task_struct *tsk, int sig)
    {
    + void __user *handler = tsk->sighand->action[sig-1].sa.sa_handler;
    if (is_global_init(tsk))
    return 1;
    - if (tsk->ptrace & PT_PTRACED)
    + if (handler != SIG_IGN && handler != SIG_DFL)
    return 0;
    - return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
    - (tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);
    + return !tracehook_consider_fatal_signal(tsk, sig, handler);
    }


    @@ -770,7 +770,8 @@ static void complete_signal(int sig, struct task_struct *p, int group)
    if (sig_fatal(p, sig) &&
    !(signal->flags & (SIGNAL_UNKILLABLE | SIGNAL_GROUP_EXIT)) &&
    !sigismember(&t->real_blocked, sig) &&
    - (sig == SIGKILL || !(t->ptrace & PT_PTRACED))) {
    + (sig == SIGKILL ||
    + !tracehook_consider_fatal_signal(t, sig, SIG_DFL))) {
    /*
    * This signal will be fatal to the whole group.
    */

    \
     
     \ /
      Last update: 2008-07-17 09:35    [W:2.884 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site