diff --git a/lauxlib.c b/lauxlib.c index 64b325d3..555a5976 100644 --- a/lauxlib.c +++ b/lauxlib.c @@ -1094,8 +1094,8 @@ static void warnfon (void *ud, const char *message, int tocont) { /* ** A function to compute an unsigned int with some level of -** randomness. Rely on Address Space Layout Randomization (if present), -** current time, and clock. +** randomness. Rely on Address Space Layout Randomization (if present) +** and the current time. */ #if !defined(luai_makeseed) @@ -1115,18 +1115,16 @@ static void warnfon (void *ud, const char *message, int tocont) { static unsigned int luai_makeseed (void) { - unsigned int buff[sof(void*) + sof(clock_t) + sof(time_t)]; + unsigned int buff[sof(void*) + sof(time_t)]; unsigned int res; unsigned int *b = buff; - clock_t c = clock(); time_t t = time(NULL); void *h = buff; addbuff(b, h); /* local variable's address */ - addbuff(b, c); /* clock */ addbuff(b, t); /* time */ res = buff[0]; for (b = buff + 1; b < buff + sof(buff); b++) - res += *b; + res ^= (res >> 3) + (res << 7) + *b; return res; } diff --git a/lmathlib.c b/lmathlib.c index f13cae4a..6d63950c 100644 --- a/lmathlib.c +++ b/lmathlib.c @@ -607,8 +607,8 @@ static int math_randomseed (lua_State *L) { RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); lua_Unsigned n1, n2; if (lua_isnone(L, 1)) { - n1 = luaL_makeseed(L); - n2 = I2UInt(state->s[0]); + n1 = luaL_makeseed(L); /* "random" seed */ + n2 = I2UInt(nextrand(state->s)); /* in case seed is not that random... */ } else { n1 = luaL_checkinteger(L, 1); diff --git a/ltablib.c b/ltablib.c index 82584459..44d55ef5 100644 --- a/ltablib.c +++ b/ltablib.c @@ -310,7 +310,7 @@ static IdxT partition (lua_State *L, IdxT lo, IdxT up) { */ static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { IdxT r4 = (up - lo) / 4; /* range/4 */ - IdxT p = rnd % (r4 * 2) + (lo + r4); + IdxT p = (rnd ^ lo ^ up) % (r4 * 2) + (lo + r4); lua_assert(lo + r4 <= p && p <= up - r4); return p; } diff --git a/manual/manual.of b/manual/manual.of index fdae76f2..446517ec 100644 --- a/manual/manual.of +++ b/manual/manual.of @@ -5728,8 +5728,8 @@ it does not run it. @apii{0,0,-} Returns a value with a weak attempt for randomness. -(It produces that value based on the current date and time, -the current processor time, and the address of an internal variable, +(It produces that value based on the current date and time +and the address of an internal variable, in case the machine has Address Space Layout Randomization.) }