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

Commit 0896f287 authored by Kyle McMartin's avatar Kyle McMartin Committed by Trilok Soni
Browse files

arm64: __clear_user: handle exceptions on strb



ARM64 currently doesn't fix up faults on the single-byte (strb) case of
__clear_user... which means that we can cause a nasty kernel panic as an
ordinary user with any multiple PAGE_SIZE+1 read from /dev/zero.
i.e.: dd if=/dev/zero of=foo ibs=1 count=1 (or ibs=65537, etc.)

This is a pretty obscure bug in the general case since we'll only
__do_kernel_fault (since there's no extable entry for pc) if the
mmap_sem is contended. However, with CONFIG_DEBUG_VM enabled, we'll
always fault.

if (!down_read_trylock(&mm->mmap_sem)) {
	if (!user_mode(regs) && !search_exception_tables(regs->pc))
		goto no_context;
retry:
	down_read(&mm->mmap_sem);
} else {
	/*
	 * The above down_read_trylock() might have succeeded in
	 * which
	 * case, we'll have missed the might_sleep() from
	 * down_read().
	 */
	might_sleep();
	if (!user_mode(regs) && !search_exception_tables(regs->pc))
		goto no_context;
}

Fix that by adding an extable entry for the strb instruction, since it
touches user memory, similar to the other stores in __clear_user.

Change-Id: I7256cecee5ff3f8f5958d3f7f39ad6b4e761c828
Signed-off-by: default avatarKyle McMartin <kyle@redhat.com>
Reported-by: default avatarMiloš Prchlík <mprchlik@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Git-commit: 97fc15436b36ee3956efad83e22a557991f7d19d
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git


Signed-off-by: default avatarTrilok Soni <tsoni@codeaurora.org>
parent 7aad09de
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ USER(9f, strh wzr, [x0], #2 )
	sub	x1, x1, #2
4:	adds	x1, x1, #1
	b.mi	5f
	strb	wzr, [x0]
USER(9f, strb	wzr, [x0]	)
5:	mov	x0, #0
	ret
ENDPROC(__clear_user)