DragonFlyBSD Kernel Audit
DF-0977 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/platform/pc64/x86_64/pmap.c b/sys/platform/pc64/x86_64/pmap.c
--- a/sys/platform/pc64/x86_64/pmap.c
+++ b/sys/platform/pc64/x86_64/pmap.c
@@ -6277,9 +6277,12 @@
 		pd += (va - DMAP_MIN_ADDRESS) >> PDRSHIFT;
 
 		while ((long)count > 0) {
-			*pd =
-			   (*pd & ~(pd_entry_t)(kernel_pmap->pmap_cache_mask_pde)) |
-			   kernel_pmap->pmap_cache_bits_pde[mode];
+			pd_entry_t opt, npt;
+			do {
+				opt = *pd;
+				npt = (opt & ~(pd_entry_t)(kernel_pmap->pmap_cache_mask_pde)) |
+				    kernel_pmap->pmap_cache_bits_pde[mode];
+			} while (atomic_cmpset_long(pd, opt, npt) == 0);
 			count -= NBPDR / PAGE_SIZE;
 			va += NBPDR;
 			++pd;