Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+3 −3
Original line number Diff line number Diff line
@@ -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),
@@ -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)
+5 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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);