Commit 0a996c1a authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

signal/x86: Use force_sig_fault where appropriate

parent 419ceeb1
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -100,20 +100,13 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size)
	 */

	if (!access_ok(VERIFY_WRITE, (void __user *)ptr, size)) {
		siginfo_t info;
		struct thread_struct *thread = &current->thread;

		thread->error_code	= 6;  /* user fault, no page, write */
		thread->cr2		= ptr;
		thread->trap_nr		= X86_TRAP_PF;

		clear_siginfo(&info);
		info.si_signo		= SIGSEGV;
		info.si_errno		= 0;
		info.si_code		= SEGV_MAPERR;
		info.si_addr		= (void __user *)ptr;

		force_sig_info(SIGSEGV, &info, current);
		force_sig_fault(SIGSEGV, SEGV_MAPERR, (void __user *)ptr, current);
		return false;
	} else {
		return true;
+2 −8
Original line number Diff line number Diff line
@@ -1372,18 +1372,12 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
					 int error_code, int si_code)
{
	struct siginfo info;

	clear_siginfo(&info);
	tsk->thread.trap_nr = X86_TRAP_DB;
	tsk->thread.error_code = error_code;

	info.si_signo = SIGTRAP;
	info.si_code = si_code;
	info.si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;

	/* Send us the fake SIGTRAP */
	force_sig_info(SIGTRAP, &info, tsk);
	force_sig_fault(SIGTRAP, si_code,
			user_mode(regs) ? (void __user *)regs->ip : NULL, tsk);
}

void user_single_step_report(struct pt_regs *regs)
+5 −9
Original line number Diff line number Diff line
@@ -808,7 +808,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)
{
	struct task_struct *task = current;
	struct fpu *fpu = &task->thread.fpu;
	siginfo_t info;
	int si_code;
	char *str = (trapnr == X86_TRAP_MF) ? "fpu exception" :
						"simd exception";

@@ -834,18 +834,14 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)

	task->thread.trap_nr	= trapnr;
	task->thread.error_code = error_code;
	clear_siginfo(&info);
	info.si_signo		= SIGFPE;
	info.si_errno		= 0;
	info.si_addr		= (void __user *)uprobe_get_trap_addr(regs);

	info.si_code = fpu__exception_code(fpu, trapnr);

	si_code = fpu__exception_code(fpu, trapnr);
	/* Retry when we get spurious exceptions: */
	if (!info.si_code)
	if (!si_code)
		return;

	force_sig_info(SIGFPE, &info, task);
	force_sig_fault(SIGFPE, si_code,
			(void __user *)uprobe_get_trap_addr(regs), task);
}

dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)
+1 −7
Original line number Diff line number Diff line
@@ -271,19 +271,13 @@ static int emulate_umip_insn(struct insn *insn, int umip_inst,
 */
static void force_sig_info_umip_fault(void __user *addr, struct pt_regs *regs)
{
	siginfo_t info;
	struct task_struct *tsk = current;

	tsk->thread.cr2		= (unsigned long)addr;
	tsk->thread.error_code	= X86_PF_USER | X86_PF_WRITE;
	tsk->thread.trap_nr	= X86_TRAP_PF;

	clear_siginfo(&info);
	info.si_signo	= SIGSEGV;
	info.si_errno	= 0;
	info.si_code	= SEGV_MAPERR;
	info.si_addr	= addr;
	force_sig_info(SIGSEGV, &info, tsk);
	force_sig_fault(SIGSEGV, SEGV_MAPERR, addr, tsk);

	if (!(show_unhandled_signals && unhandled_signal(tsk, SIGSEGV)))
		return;