⬢ DragonFlyBSD Kernel Audit
DF-5695 / fix.diff
← back to finding ↓ download raw
--- a/sys/libkern/arc4random.c
+++ b/sys/libkern/arc4random.c
@@ -104,6 +104,7 @@
 	struct arc4_data *d = arc4_data_pcpu[mycpuid];
 	uint32_t ret;
 
+	crit_enter();
 	if (++(d->arc4_numruns) > ARC4_MAXRUNS ||
 	    time_uptime > d->arc4_nextreseed)
 		arc4_randomstir(d);
@@ -113,6 +114,7 @@
 	ret |= arc4_randbyte(d) << 16;
 	ret |= arc4_randbyte(d) << 24;
 
+	crit_exit();
 	return ret;
 }
 
@@ -122,6 +124,7 @@
 	struct arc4_data *d = arc4_data_pcpu[mycpuid];
 	uint64_t ret;
 
+	crit_enter();
 	if (++(d->arc4_numruns) > ARC4_MAXRUNS ||
 	    time_uptime > d->arc4_nextreseed)
 		arc4_randomstir(d);
@@ -135,6 +138,7 @@
 	ret |= (uint64_t)arc4_randbyte(d) << 48;
 	ret |= (uint64_t)arc4_randbyte(d) << 56;
 
+	crit_exit();
 	return ret;
 }
 
@@ -144,10 +148,9 @@
 	struct arc4_data *d = arc4_data_pcpu[mycpuid];
 	uint8_t *p = ptr;
 
-#if 0
-	/* No one call this function in ISR/ithread. */
+	/* Serialize against LWKT preemption (netisr/TCP threads and
+	 * direct-dispatch contexts also consume this generator). */
 	crit_enter();
-#endif
 
 	if (++(d->arc4_numruns) > ARC4_MAXRUNS ||
 	    time_uptime > d->arc4_nextreseed)
@@ -156,9 +159,7 @@
 	while (len--)
 		*p++ = arc4_randbyte(d);
 
-#if 0
 	crit_exit();
-#endif
 }
 
 /*