Skip to content

Commit

Permalink
um: Handle tracehook_report_syscall_entry() result
Browse files Browse the repository at this point in the history
tracehook_report_syscall_entry() is allowed to fail,
in case of failure we have to abort the current syscall.

Signed-off-by: Richard Weinberger <richard@nod.at>
  • Loading branch information
Richard Weinberger committed May 31, 2015
1 parent 30b11ee commit 5334cda
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 5 deletions.
2 changes: 1 addition & 1 deletion arch/um/include/asm/ptrace-generic.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ extern int putreg(struct task_struct *child, int regno, unsigned long value);

extern int arch_copy_tls(struct task_struct *new);
extern void clear_flushed_tls(struct task_struct *task);
extern void syscall_trace_enter(struct pt_regs *regs);
extern int syscall_trace_enter(struct pt_regs *regs);
extern void syscall_trace_leave(struct pt_regs *regs);

#endif
Expand Down
6 changes: 3 additions & 3 deletions arch/um/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ static void send_sigtrap(struct task_struct *tsk, struct uml_pt_regs *regs,
* XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and
* PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check
*/
void syscall_trace_enter(struct pt_regs *regs)
int syscall_trace_enter(struct pt_regs *regs)
{
audit_syscall_entry(UPT_SYSCALL_NR(&regs->regs),
UPT_SYSCALL_ARG1(&regs->regs),
Expand All @@ -140,9 +140,9 @@ void syscall_trace_enter(struct pt_regs *regs)
UPT_SYSCALL_ARG4(&regs->regs));

if (!test_thread_flag(TIF_SYSCALL_TRACE))
return;
return 0;

tracehook_report_syscall_entry(regs);
return tracehook_report_syscall_entry(regs);
}

void syscall_trace_leave(struct pt_regs *regs)
Expand Down
6 changes: 5 additions & 1 deletion arch/um/kernel/skas/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ void handle_syscall(struct uml_pt_regs *r)
long result;
int syscall;

syscall_trace_enter(regs);
if (syscall_trace_enter(regs)) {
result = -ENOSYS;
goto out;
}

/*
* This should go in the declaration of syscall, but when I do that,
Expand All @@ -34,6 +37,7 @@ void handle_syscall(struct uml_pt_regs *r)
result = -ENOSYS;
else result = EXECUTE_SYSCALL(syscall, regs);

out:
PT_REGS_SET_SYSCALL_RETURN(regs, result);

syscall_trace_leave(regs);
Expand Down

0 comments on commit 5334cda

Please sign in to comment.