forked from mirrors/linux
		
	drivers: char: mem: Check for address space wraparound with mmap()
/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> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									0d83539092
								
							
						
					
					
						commit
						b299cde245
					
				
					 1 changed files with 5 additions and 0 deletions
				
			
		|  | @ -340,6 +340,11 @@ static const struct vm_operations_struct mmap_mem_ops = { | |||
| static int mmap_mem(struct file *file, struct vm_area_struct *vma) | ||||
| { | ||||
| 	size_t size = vma->vm_end - vma->vm_start; | ||||
| 	phys_addr_t offset = (phys_addr_t)vma->vm_pgoff << PAGE_SHIFT; | ||||
| 
 | ||||
| 	/* It's illegal to wrap around the end of the physical address space. */ | ||||
| 	if (offset + (phys_addr_t)size < offset) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size)) | ||||
| 		return -EINVAL; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Julius Werner
						Julius Werner