ARM: kernel: fix sanity check for copying
. phys_copy() (taken from memcpy) can legitimately cause pagefaults below the source/dest address due to word-alignment Change-Id: Ibee8f069781d16caea671246c021fb17a2a892b1
This commit is contained in:
		
							parent
							
								
									7a07b58aa8
								
							
						
					
					
						commit
						2aa82a9c7b
					
				@ -196,12 +196,19 @@ static int lin_lin_copy(struct proc *srcproc, vir_bytes srclinaddr,
 | 
			
		||||
		PHYS_COPY_CATCH(srcptr, dstptr, chunk, addr);
 | 
			
		||||
 | 
			
		||||
		if(addr) {
 | 
			
		||||
			/* If addr is nonzero, a page fault was caught. */
 | 
			
		||||
			/* If addr is nonzero, a page fault was caught.
 | 
			
		||||
			 *
 | 
			
		||||
			 * phys_copy does all memory accesses word-aligned (rounded
 | 
			
		||||
			 * down), so pagefaults can occur at a lower address than
 | 
			
		||||
			 * the specified offsets. compute the lower bounds for sanity
 | 
			
		||||
			 * check use.
 | 
			
		||||
			 */
 | 
			
		||||
			vir_bytes src_aligned = srcptr & ~0x3, dst_aligned = dstptr & ~0x3;
 | 
			
		||||
 | 
			
		||||
			if(addr >= srcptr && addr < (srcptr + chunk)) {
 | 
			
		||||
			if(addr >= src_aligned && addr < (srcptr + chunk)) {
 | 
			
		||||
				return EFAULT_SRC;
 | 
			
		||||
			}
 | 
			
		||||
			if(addr >= dstptr && addr < (dstptr + chunk)) {
 | 
			
		||||
			if(addr >= dst_aligned && addr < (dstptr + chunk)) {
 | 
			
		||||
				return EFAULT_DST;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user