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

Commit 8f5a00eb authored by Al Viro's avatar Al Viro Committed by Ralf Baechle
Browse files

MIPS: Sanitize restart logics



Put the original syscall number into ->regs[0] when we leave syscall
with error.  Use it in restart logics.  Everything else will have
it 0 since we pass through SAVE_SOME on all the ways in.  Note that
in places like bad_stack and inllegal_syscall we leave it 0 - it's not
restartable.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Cc: linux-kernel@vger.kernel.org
Cc: linux-arch@vger.kernel.org
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/1698/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent e5b377a8
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ int __compute_return_epc(struct pt_regs *regs)
		return -EFAULT;
	}

	regs->regs[0] = 0;
	switch (insn.i_format.opcode) {
	/*
	 * jr and jalr are in r_format format.
+4 −5
Original line number Diff line number Diff line
@@ -63,9 +63,9 @@ stack_done:
	sw	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	lw	t1, PT_R2(sp)		# syscall number
	negu	v0			# error
	sw	v0, PT_R0(sp)		# set flag for syscall
					# restarting
	sw	t1, PT_R0(sp)		# save it for syscall restarting
1:	sw	v0, PT_R2(sp)		# result

o32_syscall_exit:
@@ -104,9 +104,9 @@ syscall_trace_entry:
	sw	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	lw	t1, PT_R2(sp)		# syscall number
	negu	v0			# error
	sw	v0, PT_R0(sp)		# set flag for syscall
					# restarting
	sw	t1, PT_R0(sp)		# save it for syscall restarting
1:	sw	v0, PT_R2(sp)		# result

	j	syscall_exit
@@ -170,7 +170,6 @@ stackargs:
	 */
bad_stack:
	negu	v0				# error
	sw	v0, PT_R0(sp)
	sw	v0, PT_R2(sp)
	li	t0, 1				# set error flag
	sw	t0, PT_R7(sp)
+4 −3
Original line number Diff line number Diff line
@@ -66,9 +66,9 @@ NESTED(handle_sys64, PT_SIZE, sp)
	sd	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	ld	t1, PT_R2(sp)		# syscall number
	dnegu	v0			# error
	sd	v0, PT_R0(sp)		# set flag for syscall
					# restarting
	sd	t1, PT_R0(sp)		# save it for syscall restarting
1:	sd	v0, PT_R2(sp)		# result

n64_syscall_exit:
@@ -109,8 +109,9 @@ syscall_trace_entry:
	sd	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	ld	t1, PT_R2(sp)		# syscall number
	dnegu	v0			# error
	sd	v0, PT_R0(sp)		# set flag for syscall restarting
	sd	t1, PT_R0(sp)		# save it for syscall restarting
1:	sd	v0, PT_R2(sp)		# result

	j	syscall_exit
+4 −2
Original line number Diff line number Diff line
@@ -65,8 +65,9 @@ NESTED(handle_sysn32, PT_SIZE, sp)
	sd	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	ld	t1, PT_R2(sp)		# syscall number
	dnegu	v0			# error
	sd	v0, PT_R0(sp)		# set flag for syscall restarting
	sd	t1, PT_R0(sp)		# save it for syscall restarting
1:	sd	v0, PT_R2(sp)		# result

	local_irq_disable		# make sure need_resched and
@@ -106,8 +107,9 @@ n32_syscall_trace_entry:
	sd	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	ld	t1, PT_R2(sp)		# syscall number
	dnegu	v0			# error
	sd	v0, PT_R0(sp)		# set flag for syscall restarting
	sd	t1, PT_R0(sp)		# save it for syscall restarting
1:	sd	v0, PT_R2(sp)		# result

	j	syscall_exit
+4 −3
Original line number Diff line number Diff line
@@ -93,8 +93,9 @@ NESTED(handle_sys, PT_SIZE, sp)
	sd	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	ld	t1, PT_R2(sp)		# syscall number
	dnegu	v0			# error
	sd	v0, PT_R0(sp)		# flag for syscall restarting
	sd	t1, PT_R0(sp)		# save it for syscall restarting
1:	sd	v0, PT_R2(sp)		# result

o32_syscall_exit:
@@ -142,8 +143,9 @@ trace_a_syscall:
	sd	t0, PT_R7(sp)		# set error flag
	beqz	t0, 1f

	ld	t1, PT_R2(sp)		# syscall number
	dnegu	v0			# error
	sd	v0, PT_R0(sp)		# set flag for syscall restarting
	sd	t1, PT_R0(sp)		# save it for syscall restarting
1:	sd	v0, PT_R2(sp)		# result

	j	syscall_exit
@@ -155,7 +157,6 @@ trace_a_syscall:
	 */
bad_stack:
	dnegu	v0			# error
	sd	v0, PT_R0(sp)
	sd	v0, PT_R2(sp)
	li	t0, 1			# set error flag
	sd	t0, PT_R7(sp)
Loading