[PATCH 19/19] utrace: consult PT_SINGLE_STEP/PT_SINGLE_BLOCK before user_disable_single_step()

Oleg Nesterov oleg at redhat.com
Fri Jul 1 00:21:57 UTC 2011


- 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 <oleg at 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




More information about the kernel mailing list