Commit 5334cdae authored by Richard Weinberger's avatar Richard Weinberger

um: Handle tracehook_report_syscall_entry() result

tracehook_report_syscall_entry() is allowed to fail,
in case of failure we have to abort the current syscall.
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 30b11ee9
...@@ -37,7 +37,7 @@ extern int putreg(struct task_struct *child, int regno, unsigned long value); ...@@ -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 int arch_copy_tls(struct task_struct *new);
extern void clear_flushed_tls(struct task_struct *task); 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); extern void syscall_trace_leave(struct pt_regs *regs);
#endif #endif
......
...@@ -131,7 +131,7 @@ static void send_sigtrap(struct task_struct *tsk, struct uml_pt_regs *regs, ...@@ -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 * XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and
* PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check * 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), audit_syscall_entry(UPT_SYSCALL_NR(&regs->regs),
UPT_SYSCALL_ARG1(&regs->regs), UPT_SYSCALL_ARG1(&regs->regs),
...@@ -140,9 +140,9 @@ void syscall_trace_enter(struct pt_regs *regs) ...@@ -140,9 +140,9 @@ void syscall_trace_enter(struct pt_regs *regs)
UPT_SYSCALL_ARG4(&regs->regs)); UPT_SYSCALL_ARG4(&regs->regs));
if (!test_thread_flag(TIF_SYSCALL_TRACE)) 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) void syscall_trace_leave(struct pt_regs *regs)
......
...@@ -18,7 +18,10 @@ void handle_syscall(struct uml_pt_regs *r) ...@@ -18,7 +18,10 @@ void handle_syscall(struct uml_pt_regs *r)
long result; long result;
int syscall; 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, * This should go in the declaration of syscall, but when I do that,
...@@ -34,6 +37,7 @@ void handle_syscall(struct uml_pt_regs *r) ...@@ -34,6 +37,7 @@ void handle_syscall(struct uml_pt_regs *r)
result = -ENOSYS; result = -ENOSYS;
else result = EXECUTE_SYSCALL(syscall, regs); else result = EXECUTE_SYSCALL(syscall, regs);
out:
PT_REGS_SET_SYSCALL_RETURN(regs, result); PT_REGS_SET_SYSCALL_RETURN(regs, result);
syscall_trace_leave(regs); syscall_trace_leave(regs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment