Browse Source

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>
Richard Weinberger 10 years ago
parent
commit
5334cdae40

+ 1 - 1
arch/um/include/asm/ptrace-generic.h

@@ -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

+ 3 - 3
arch/um/kernel/ptrace.c

@@ -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)
 			    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)

+ 5 - 1
arch/um/kernel/skas/syscall.c

@@ -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);