]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
ARC: mm: SIGSEGV userspace trying to access kernel virtual memory
authorEugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Mon, 13 May 2019 17:28:00 +0000 (20:28 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Jun 2019 10:19:14 +0000 (12:19 +0200)
commit35f473d145a1d904d8838d09912dc9ec95cc5eb9
tree888172812facd6f7d4dca232cda794cee27099e2
parentde3cfea50bafea1dfd9da6fb31198ab2ff2da424
ARC: mm: SIGSEGV userspace trying to access kernel virtual memory

commit a8c715b4dd73c26a81a9cc8dc792aa715d8b4bb2 upstream.

As of today if userspace process tries to access a kernel virtual addres
(0x7000_0000 to 0x7ffff_ffff) such that a legit kernel mapping already
exists, that process hangs instead of being killed with SIGSEGV

Fix that by ensuring that do_page_fault() handles kenrel vaddr only if
in kernel mode.

And given this, we can also simplify the code a bit. Now a vmalloc fault
implies kernel mode so its failure (for some reason) can reuse the
@no_context label and we can remove @bad_area_nosemaphore.

Reproduce user test for original problem:

------------------------>8-----------------
 #include <stdlib.h>
 #include <stdint.h>

 int main(int argc, char *argv[])
 {
  volatile uint32_t temp;

  temp = *(uint32_t *)(0x70000000);
 }
------------------------>8-----------------

Cc: <stable@vger.kernel.org>
Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arc/mm/fault.c