Skip to content

Commit 837bfdb

Browse files
jwerner-chromiumgregkh
authored andcommitted
drivers: char: mem: Check for address space wraparound with mmap()
commit b299cde245b0b76c977f4291162cf668e087b408 upstream. /dev/mem currently allows mmap() mappings that wrap around the end of the physical address space, which should probably be illegal. It circumvents the existing STRICT_DEVMEM permission check because the loop immediately terminates (as the start address is already higher than the end address). On the x86_64 architecture it will then cause a panic (from the BUG(start >= end) in arch/x86/mm/pat.c:reserve_memtype()). This patch adds an explicit check to make sure offset + size will not wrap around in the physical address type. Signed-off-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 52cf247 commit 837bfdb

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

drivers/char/mem.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,11 @@ static const struct vm_operations_struct mmap_mem_ops = {
343343
static int mmap_mem(struct file *file, struct vm_area_struct *vma)
344344
{
345345
size_t size = vma->vm_end - vma->vm_start;
346+
phys_addr_t offset = (phys_addr_t)vma->vm_pgoff << PAGE_SHIFT;
347+
348+
/* It's illegal to wrap around the end of the physical address space. */
349+
if (offset + (phys_addr_t)size < offset)
350+
return -EINVAL;
346351

347352
if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size))
348353
return -EINVAL;

0 commit comments

Comments
 (0)