diff options
author | Richard Weinberger <richard@nod.at> | 2015-05-31 16:59:03 -0400 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2015-05-31 16:59:03 -0400 |
commit | 5334cdae407a5778a297a98a75ca61140e37ebfa (patch) | |
tree | 8b1c4aaad459fa26fb13b5ef4244d986c831048d /arch/um/kernel | |
parent | 30b11ee9ae23d78de66b9ae315880af17a64ba83 (diff) |
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>
Diffstat (limited to 'arch/um/kernel')
-rw-r--r-- | arch/um/kernel/ptrace.c | 6 | ||||
-rw-r--r-- | arch/um/kernel/skas/syscall.c | 6 |
2 files changed, 8 insertions, 4 deletions
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 174ee5017264..cac2ea058b7a 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c | |||
@@ -131,7 +131,7 @@ static void send_sigtrap(struct task_struct *tsk, struct uml_pt_regs *regs, | |||
131 | * XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and | 131 | * XXX Check PT_DTRACE vs TIF_SINGLESTEP for singlestepping check and |
132 | * PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check | 132 | * PT_PTRACED vs TIF_SYSCALL_TRACE for syscall tracing check |
133 | */ | 133 | */ |
134 | void syscall_trace_enter(struct pt_regs *regs) | 134 | int syscall_trace_enter(struct pt_regs *regs) |
135 | { | 135 | { |
136 | audit_syscall_entry(UPT_SYSCALL_NR(®s->regs), | 136 | audit_syscall_entry(UPT_SYSCALL_NR(®s->regs), |
137 | UPT_SYSCALL_ARG1(®s->regs), | 137 | UPT_SYSCALL_ARG1(®s->regs), |
@@ -140,9 +140,9 @@ void syscall_trace_enter(struct pt_regs *regs) | |||
140 | UPT_SYSCALL_ARG4(®s->regs)); | 140 | UPT_SYSCALL_ARG4(®s->regs)); |
141 | 141 | ||
142 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | 142 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) |
143 | return; | 143 | return 0; |
144 | 144 | ||
145 | tracehook_report_syscall_entry(regs); | 145 | return tracehook_report_syscall_entry(regs); |
146 | } | 146 | } |
147 | 147 | ||
148 | void syscall_trace_leave(struct pt_regs *regs) | 148 | void syscall_trace_leave(struct pt_regs *regs) |
diff --git a/arch/um/kernel/skas/syscall.c b/arch/um/kernel/skas/syscall.c index c0681e097432..d9ec0068b623 100644 --- a/arch/um/kernel/skas/syscall.c +++ b/arch/um/kernel/skas/syscall.c | |||
@@ -18,7 +18,10 @@ void handle_syscall(struct uml_pt_regs *r) | |||
18 | long result; | 18 | long result; |
19 | int syscall; | 19 | int syscall; |
20 | 20 | ||
21 | syscall_trace_enter(regs); | 21 | if (syscall_trace_enter(regs)) { |
22 | result = -ENOSYS; | ||
23 | goto out; | ||
24 | } | ||
22 | 25 | ||
23 | /* | 26 | /* |
24 | * This should go in the declaration of syscall, but when I do that, | 27 | * 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 | result = -ENOSYS; | 37 | result = -ENOSYS; |
35 | else result = EXECUTE_SYSCALL(syscall, regs); | 38 | else result = EXECUTE_SYSCALL(syscall, regs); |
36 | 39 | ||
40 | out: | ||
37 | PT_REGS_SET_SYSCALL_RETURN(regs, result); | 41 | PT_REGS_SET_SYSCALL_RETURN(regs, result); |
38 | 42 | ||
39 | syscall_trace_leave(regs); | 43 | syscall_trace_leave(regs); |