lkml.org 
[lkml]   [2008]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [RFC PATCH] set TASK_TRACED before arch_ptrace code to fix a race
    From
    Date
    On Thu, 2008-05-22 at 10:47 +0800, Luming Yu wrote:
    > Hello list,
    >
    > The following patch is to fixed a race in ptrace_stop handling which
    > causes "strace" hang if the target process blocks SIGTRAP with the
    > test case filed at
    > https://bugzilla.redhat.com/show_bug.cgi?id=446200#c16.
    > Please note this is just IA64 problem because just IA64 has
    > arch_ptrace_stop_needed defined, and has arch_ptrace_stop defined that
    > would set notify_resume flags for syncing rbs...but it also opens the
    > door to invoke ia64_do_signal->get_signal_to_deliver before setting
    > current PTRACED flag. Please help review.
    >
    > **The patch is enclosed in text attachment*
    > **I'm using web client to send the patch* *

    I'm inlining the patch for sake of convenience:

    >
    > Signed-off-by: Yu Luming <luming.yu@intel.com>
    > --------------------------------------
    > signal.c | 5 +++--
    > 1 file changed, 3 insertions(+), 2 deletions(-)
    >
    > --- 0/kernel/signal.c 2008-05-14 02:24:51.000000000 +0800
    > +++ 1/kernel/signal.c 2008-05-22 13:54:42.000000000 +0800
    > @@ -1488,6 +1488,9 @@
    > {
    > int killed = 0;
    >
    > + /* Let the debugger run. */
    > + __set_current_state(TASK_TRACED);
    > +

    That's probably not what we want. What happens if the task then sleeps
    during the user-space access? Unless I forgot something obvious, it will
    never get scheduled again...

    Petr Tesarik

    > if (arch_ptrace_stop_needed(exit_code, info)) {
    > /*
    > * The arch code has something special to do before a
    > @@ -1516,8 +1519,6 @@
    > current->last_siginfo = info;
    > current->exit_code = exit_code;
    >
    > - /* Let the debugger run. */
    > - __set_current_state(TASK_TRACED);
    > spin_unlock_irq(&current->sighand->siglock);
    > read_lock(&tasklist_lock);
    > if (!unlikely(killed) && may_ptrace_stop()) {



    \
     
     \ /
      Last update: 2008-05-22 10:49    [W:2.160 / U:0.520 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site