aboutsummaryrefslogtreecommitdiff
path: root/lauxlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-03-20 16:13:17 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2023-03-20 16:13:17 -0300
commit5a04f1851e0d42b4bcbb0af103490bc964e985aa (patch)
tree227f98d4fff3f1bd1eea4d20ddd4aa0ec7562ddd /lauxlib.c
parent8c064fdc23bd745bbd3456a58cc9e2521f8e4263 (diff)
downloadlua-5a04f1851e0d42b4bcbb0af103490bc964e985aa.tar.gz
lua-5a04f1851e0d42b4bcbb0af103490bc964e985aa.tar.bz2
lua-5a04f1851e0d42b4bcbb0af103490bc964e985aa.zip
New function 'luaL_makeseed'
This function unifies code from 'lua_newstate', 'math.randomseed', and 'table.sort' that tries to create a value with a minimum level of randomness.
Diffstat (limited to 'lauxlib.c')
-rw-r--r--lauxlib.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/lauxlib.c b/lauxlib.c
index 4ca6c654..64b325d3 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1091,8 +1091,56 @@ static void warnfon (void *ud, const char *message, int tocont) {
1091} 1091}
1092 1092
1093 1093
1094
1095/*
1096** A function to compute an unsigned int with some level of
1097** randomness. Rely on Address Space Layout Randomization (if present),
1098** current time, and clock.
1099*/
1100#if !defined(luai_makeseed)
1101
1102#include <time.h>
1103
1104
1105/*
1106** Size of 'e' measured in number of 'unsigned int's. (In the weird
1107** case that the division truncates, we just lose some part of the
1108** value, no big deal.)
1109*/
1110#define sof(e) (sizeof(e) / sizeof(unsigned int))
1111
1112
1113#define addbuff(b,v) \
1114 (memcpy(b, &(v), sof(v) * sizeof(unsigned int)), b += sof(v))
1115
1116
1117static unsigned int luai_makeseed (void) {
1118 unsigned int buff[sof(void*) + sof(clock_t) + sof(time_t)];
1119 unsigned int res;
1120 unsigned int *b = buff;
1121 clock_t c = clock();
1122 time_t t = time(NULL);
1123 void *h = buff;
1124 addbuff(b, h); /* local variable's address */
1125 addbuff(b, c); /* clock */
1126 addbuff(b, t); /* time */
1127 res = buff[0];
1128 for (b = buff + 1; b < buff + sof(buff); b++)
1129 res += *b;
1130 return res;
1131}
1132
1133#endif
1134
1135
1136LUALIB_API unsigned int luaL_makeseed (lua_State *L) {
1137 (void)L; /* unused */
1138 return luai_makeseed();
1139}
1140
1141
1094LUALIB_API lua_State *luaL_newstate (void) { 1142LUALIB_API lua_State *luaL_newstate (void) {
1095 lua_State *L = lua_newstate(l_alloc, NULL); 1143 lua_State *L = lua_newstate(l_alloc, NULL, luai_makeseed());
1096 if (l_likely(L)) { 1144 if (l_likely(L)) {
1097 lua_atpanic(L, &panic); 1145 lua_atpanic(L, &panic);
1098 lua_setwarnf(L, warnfoff, L); /* default is warnings off */ 1146 lua_setwarnf(L, warnfoff, L); /* default is warnings off */