--- 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 } /*