- do not do user_enable_block_step() if PT_SINGLE_STEP is set, in this
  case ptrace has already called user_enable_single_step()

- do not do user_disable_single_step() if PT_*_STEP is set, ptrace needs
  the stepping

Unless the tracee is killed this can't race with ptrace, this is called
by the tracee itself.

Signed-off-by: Oleg Nesterov <o...@redhat.com>
---
 kernel/utrace.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/kernel/utrace.c b/kernel/utrace.c
index 508c13c..d6607cb 100644
--- a/kernel/utrace.c
+++ b/kernel/utrace.c
@@ -1828,7 +1828,8 @@ static void finish_resume_report(struct task_struct *task,
 
        case UTRACE_BLOCKSTEP:
                if (likely(arch_has_block_step())) {
-                       user_enable_block_step(task);
+                       if (!(current->ptrace & PT_SINGLE_STEP))
+                               user_enable_block_step(task);
                        break;
                }
 
@@ -1856,7 +1857,8 @@ static void finish_resume_report(struct task_struct *task,
        case UTRACE_REPORT:
        case UTRACE_RESUME:
        default:
-               user_disable_single_step(task);
+               if (!(current->ptrace & (PT_SINGLE_STEP | PT_SINGLE_BLOCK)))
+                       user_disable_single_step(task);
                break;
        }
 }
-- 
1.5.5.1


Reply via email to