RANDOM1 was subject to rather bad modulus bias. Improve the situation a bit
authortb <tb@openbsd.org>
Mon, 26 Jun 2017 17:00:49 +0000 (17:00 +0000)
committertb <tb@openbsd.org>
Mon, 26 Jun 2017 17:00:49 +0000 (17:00 +0000)
by implementing an arc4random_uniform(3) clone with beloved jot(1) and
using it.

discussed with and ok deraadt

sys/conf/makegap.sh

index ddf16ff..e104163 100644 (file)
@@ -1,16 +1,28 @@
 #!/bin/sh -
 
+random_uniform() {
+       local   _upper_bound
+
+       if [[ $1 -gt 0 ]]; then
+               _upper_bound=$(($1 - 1))
+       else
+               _upper_bound=0
+       fi
+
+       echo `jot -r 1 0 $_upper_bound 2>/dev/null`
+}
+
 umask 007
 
 PAGE_SIZE=`sysctl -n hw.pagesize`
 PAD=$1
 GAPDUMMY=$2
 
-RANDOM1=$((RANDOM % (3 * PAGE_SIZE)))
-RANDOM2=$((RANDOM % PAGE_SIZE))
-RANDOM3=$((RANDOM % PAGE_SIZE))
-RANDOM4=$((RANDOM % PAGE_SIZE))
-RANDOM5=$((RANDOM % PAGE_SIZE))
+RANDOM1=`random_uniform $((3 * PAGE_SIZE))`
+RANDOM2=`random_uniform $PAGE_SIZE`
+RANDOM3=`random_uniform $PAGE_SIZE`
+RANDOM4=`random_uniform $PAGE_SIZE`
+RANDOM5=`random_uniform $PAGE_SIZE`
 
 cat > gap.link << __EOF__