summaryrefslogtreecommitdiff
path: root/shell/random.c
diff options
context:
space:
mode:
authorDenys Vlasenko2009-10-12 15:25:01 +0200
committerDenys Vlasenko2009-10-12 15:25:01 +0200
commit76ace254e171ee9ca7a13f36335ccad9cc6ae6e1 (patch)
tree47b017524b61e217e1dce1a82f3111b97a49425f /shell/random.c
parent3c39e702d02600e9023f2f87f6e7c2c62aa27587 (diff)
downloadbusybox-76ace254e171ee9ca7a13f36335ccad9cc6ae6e1.zip
busybox-76ace254e171ee9ca7a13f36335ccad9cc6ae6e1.tar.gz
ash,hush: fix $RANDOM in children being repeated
function old new delta next_random 46 68 +22 forkshell 248 263 +15 expand_vars_to_list 2118 2131 +13 run_pipe 1775 1782 +7 popstring 134 140 +6 builtin_umask 123 121 -2 ash_main 1356 1336 -20 get_local_var_value 125 104 -21 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 5/3 up/down: 63/-43) Total: 20 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/random.c')
-rw-r--r--shell/random.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/shell/random.c b/shell/random.c
index cca9d12..7f5821c 100644
--- a/shell/random.c
+++ b/shell/random.c
@@ -20,6 +20,13 @@ next_random(random_t *rnd)
uint32_t t;
+ if (UNINITED_RANDOM_T(rnd)) {
+ /* Can use monotonic_ns() for better randomness but for now
+ * it is not used anywhere else in busybox... so avoid bloat
+ */
+ INIT_RANDOM_T(rnd, getpid(), monotonic_us());
+ }
+
/* LCG has period of 2^32 and alternating lowest bit */
rnd->LCG = 1664525 * rnd->LCG + 1013904223;
/* Galois LFSR has period of 2^32-1 = 3 * 5 * 17 * 257 * 65537 */