NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

PR/59955 CVS commit: src/sys/arch/amd64/amd64



The following reply was made to PR kern/59955; it has been noted by GNATS.

From: "Taylor R Campbell" <riastradh%netbsd.org@localhost>
To: gnats-bugs%gnats.NetBSD.org@localhost
Cc: 
Subject: PR/59955 CVS commit: src/sys/arch/amd64/amd64
Date: Sun, 22 Feb 2026 12:14:56 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Sun Feb 22 12:14:56 UTC 2026
 
 Modified Files:
 	src/sys/arch/amd64/amd64: machdep.c
 
 Log Message:
 amd64: Fix locking around uvm_map_checkprot in mm_md_kernacc.
 
 This call was originally introduced in sys/arch/amd64/amd64/mem.c
 rev. 1.11 back in 2003 by fvdl@ with the commit message:
 
 > Proper checks for kmem reads beyond _end
 
 https://mail-index.netbsd.org/source-changes/2003/10/14/msg135803.html
 
 At some point, SOMEBODY added an assertion in uvm that made it stop
 working:
 
 > uvm_map(9): Sprinkle assertions and interface contract comments.
 >
 > No functional change intended.
 
 https://mail-index.netbsd.org/source-changes/2024/08/13/msg152763.html
 
 (Really, this assertion revealed that this path was broken all along.)
 
 This patch makes the amd64 mm_md_kernacc match the corresponding logic
 in uvm_kernacc around uvm_map_checkprot:
 
     104 	vm_map_lock_read(kernel_map);
     105 	rv = uvm_map_checkprot(kernel_map, saddr, eaddr, prot);
     106 	vm_map_unlock_read(kernel_map);
 
 https://nxr.netbsd.org/xref/src/sys/uvm/uvm_glue.c#92
 
 Now, all of these checks in /dev/mem and company look like TOCTOU
 bogosity, because the answers are stale by the time we reach uiomove,
 which has to re-check any access anyway:
 
     269 	if (!md_kva) {
     270 		bool checked = false;
     271
     272 #ifdef __HAVE_MM_MD_KERNACC
     273 		/* MD check for the address. */
     274 		error = mm_md_kernacc(addr, prot, &checked);
     275 		if (error) {
     276 			return error;
     277 		}
     278 #endif
     279 		/* UVM check for the address (unless MD indicated to not). */
     280 		if (!checked && !uvm_kernacc(addr, len, prot)) {
     281 			return EFAULT;
     282 		}
     283 	}
     284 	error = uiomove(addr, len, uio);
 
 https://nxr.netbsd.org/xref/src/sys/dev/mm.c?r=1.25#269
 
 But we can address that in a separate change.
 
 PR kern/59955: kernel diagnostic assertion "rw_lock_held(&map->lock)"
 failed: file "/home/riastradh/netbsd/11/src/sys/uvm/uvm_map.c", line
 1704
 
 
 To generate a diff of this commit:
 cvs rdiff -u -r1.378 -r1.379 src/sys/arch/amd64/amd64/machdep.c
 
 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.
 


Home | Main Index | Thread Index | Old Index