On Mon, Dec 07, 2015 at 12:49:17AM -0600, Matthew Martin wrote:
>
> Theo's diff inspired me to look for other cases of modulo bias. The
> following diff converts most modulus operations on a random number to
> use arc4random_uniform or & as appropriate. I excluded
>
> lib/libsqlite3/src/resolve.c
> regress/lib/libevent/test-time.c
> usr.sbin/nsd/rrl.c
> usr.sbin/nsd/util.c
> usr.sbin/nsd/xfrd.c
>
> as they seem to have upstreams. The only other case is games/wump/wump.c
> which has
>
> if (arc4random() % 2 == 1)
>
> This is safe and seems obvious enough to me.
>
> - Matthew Martin
Thank you. I was going to do the same :)
I think some of these are ok, but I'm unsure about some of the others.
Here are some of my concerns:
- since arc4random_uniform can potentially loop indefinitely, it
might interfere with predictable timing of some routines. I can't
tell if this is harmless in all cases below. This applies in
particular to the proposed changes in the kernel.
- changing random() to arc4random() in games might have undesired
side-effects like interfering with the reproducibility of tests or
games. I think this might apply to awk for the same reason as in the
shells.
> Index: games/atc/update.c
> ===================================================================
ok
> Index: games/hack/hack.mklev.c
> ===================================================================
> Index: games/hack/rnd.c
> ===================================================================
unsure about these two
> Index: lib/libc/stdlib/rand.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/stdlib/rand.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 rand.c
> --- lib/libc/stdlib/rand.c 13 Sep 2015 08:31:47 -0000 1.15
> +++ lib/libc/stdlib/rand.c 7 Dec 2015 06:42:17 -0000
> @@ -50,7 +50,7 @@ int
> rand(void)
> {
> if (rand_deterministic == 0)
> - return (arc4random() % ((u_int)RAND_MAX + 1));
> + return (arc4random_uniform((u_int)RAND_MAX + 1));
> return (rand_r(&next));
> }
>
this is modulo 2^n, so I think this one is fine as it is.
> Index: sbin/dhclient/dhclient.c
> ===================================================================
I have already done this independently.
> Index: sys/dev/ic/sili.c
> ===================================================================
> Index: sys/netinet6/nd6_rtr.c
> ===================================================================
> Index: sys/ufs/ffs/ffs_alloc.c
> ===================================================================
These must definitely be looked at by somebody else.
> Index: usr.bin/awk/run.c
> ===================================================================
Unsure about this one. I think deterministic sequences might be desired
in some circumstances (this one is deterministic when a seed was given).
> Index: usr.sbin/npppd/common/slist.c
> ===================================================================
> Index: usr.sbin/npppd/l2tp/l2tpd.c
> ===================================================================
> Index: usr.sbin/npppd/pppoe/pppoed.c
> ===================================================================
> Index: usr.sbin/npppd/pptp/pptpd.c
> ===================================================================
These four are ok with me.