The logic in mmrw() to check whether an address is within direct
authorbluhm <bluhm@openbsd.org>
Wed, 24 Mar 2021 14:26:39 +0000 (14:26 +0000)
committerbluhm <bluhm@openbsd.org>
Wed, 24 Mar 2021 14:26:39 +0000 (14:26 +0000)
commitfc24682d162d1168f8409889883aa738fd923555
tree79969bb5fa7623f7309543bfd6b3538e574fb9d7
parent34d3f18243457028cc628d4113aef7d75e6e452a
The logic in mmrw() to check whether an address is within direct
map was the wrong way around.  The && prevented an EFAULT error and
could pass userland addresses as kernel source to copyout(9).  The
kernel could crash with protection fault due to an invalid offset
when reading /dev/kmem.
Also make the range checks stricter.  Not only the start address
must be valid, but also the end address must be within the region
to be copied.
Note that sysctl kern.allowkmem=0 makes the bug unreachable by
default.
OK deraadt@
sys/arch/amd64/amd64/mem.c