Change ptrace_report_exec() to use ptrace_event.
Now we should fix EXEC/SYSCALL_EXIT interaction wrt PTRACE_CONT/SYSCALL.
---
kernel/ptrace.c | 44 +++++++++++++++++++++++++-------------------
1 file changed, 25 insertions(+), 19 deletions(-)
--- PU/kernel/ptrace.c~36_REPORT_EXEC 2009-09-15 15:45:47.000000000 +0200
+++ PU/kernel/ptrace.c 2009-09-15 18:05:42.000000000 +0200
@@ -194,25 +194,6 @@ static u32 utrace_ptrace_event(struct ta
return utrace_ptrace_report(0, task, event, (event << 8) | SIGTRAP);
}
-static u32 ptrace_report_exec(enum utrace_resume_action action,
- struct utrace_engine *engine,
- struct task_struct *task,
- const struct linux_binfmt *fmt,
- const struct linux_binprm *bprm,
- struct pt_regs *regs)
-{
- struct ptrace_context *context = ptrace_context(engine);
-
- if (context->options & PTRACE_O_TRACEEXEC)
- return utrace_ptrace_event(task, PTRACE_EVENT_EXEC, 0);
-
- /*
- * Old-fashioned ptrace'd exec just posts a plain signal.
- */
- send_sig(SIGTRAP, task, 0);
- return UTRACE_RESUME;
-}
-
static u32 ptrace_report_exit(enum utrace_resume_action action,
struct utrace_engine *engine,
struct task_struct *task,
@@ -347,6 +328,31 @@ static u32 ptrace_report_syscall_exit(en
return UTRACE_STOP;
}
+static u32 ptrace_report_exec(enum utrace_resume_action action,
+ struct utrace_engine *engine,
+ struct task_struct *task,
+ const struct linux_binfmt *fmt,
+ const struct linux_binprm *bprm,
+ struct pt_regs *regs)
+{
+ struct ptrace_context *context = ptrace_context(engine);
+ struct ptrace_event *ev;
+
+ if (!(context->options & PTRACE_O_TRACEEXEC)) {
+ /*
+ * Old-fashioned ptrace'd exec just posts a plain signal.
+ */
+ send_sig(SIGTRAP, task, 0);
+ return UTRACE_RESUME;
+ }
+
+ ev = ev_push(context);
+ ev->ev_code = (PTRACE_EVENT_EXEC << 8) | SIGTRAP;
+
+ return UTRACE_STOP;
+}
+
+
static u32 ptrace_resumed(struct task_struct *task,
struct utrace_engine *engine,
siginfo_t *info, struct k_sigaction *return_ka)