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: Richard Weinberger <richard@nod.at>
This commit is contained in:
@@ -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,
|
|||||||
* 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(®s->regs),
|
audit_syscall_entry(UPT_SYSCALL_NR(®s->regs),
|
||||||
UPT_SYSCALL_ARG1(®s->regs),
|
UPT_SYSCALL_ARG1(®s->regs),
|
||||||
@@ -140,9 +140,9 @@ void syscall_trace_enter(struct pt_regs *regs)
|
|||||||
UPT_SYSCALL_ARG4(®s->regs));
|
UPT_SYSCALL_ARG4(®s->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)
|
|||||||
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)
|
|||||||
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user