commit 25cd3d377ec13176a6701d9d21a278ba8f2bc3d6
parent 1028f296a8e6477cb556c75fe1397cd4e2762abe
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 15 Nov 2023 10:28:05 -0300
Buffer in 'luai_makeseed' measured in bytes
In the (rare) cases when sizeof(void*) or sizeof(time_t) are not
multiples of sizeof(int), we still can use all their bytes in the seed.
Diffstat:
2 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/lauxlib.c b/lauxlib.c
@@ -1124,29 +1124,30 @@ static void warnfon (void *ud, const char *message, int tocont) {
#include <time.h>
-/*
-** Size of 'e' measured in number of 'unsigned int's. (In the weird
-** case that the division truncates, we just lose some part of the
-** value, no big deal.)
-*/
-#define sof(e) (sizeof(e) / sizeof(unsigned int))
+/* Size for the buffer, in bytes */
+#define BUFSEEDB (sizeof(void*) + sizeof(time_t))
+
+/* Size for the buffer in int's, rounded up */
+#define BUFSEED ((BUFSEEDB + sizeof(int) - 1) / sizeof(int))
-#define addbuff(b,v) \
- (memcpy(b, &(v), sof(v) * sizeof(unsigned int)), b += sof(v))
+#define addbuff(b,v) (memcpy(b, &(v), sizeof(v)), b += sizeof(v))
static unsigned int luai_makeseed (void) {
- unsigned int buff[sof(void*) + sof(time_t)];
+ unsigned int buff[BUFSEED];
unsigned int res;
- unsigned int *b = buff;
+ unsigned int i;
time_t t = time(NULL);
void *h = buff;
+ char *b = (char*)buff;
addbuff(b, h); /* local variable's address */
addbuff(b, t); /* time */
+ /* fill (rare but possible) remain of the buffer with zeros */
+ memset(b, 0, BUFSEED * sizeof(int) - BUFSEEDB);
res = buff[0];
- for (b = buff + 1; b < buff + sof(buff); b++)
- res ^= (res >> 3) + (res << 7) + *b;
+ for (i = 0; i < BUFSEED; i++)
+ res ^= (res >> 3) + (res << 7) + buff[i];
return res;
}
diff --git a/ltests.c b/ltests.c
@@ -1160,6 +1160,12 @@ static int num2int (lua_State *L) {
}
+static int makeseed (lua_State *L) {
+ lua_pushinteger(L, luaL_makeseed(L));
+ return 1;
+}
+
+
static int newstate (lua_State *L) {
void *ud;
lua_Alloc f = lua_getallocf(L, &ud);
@@ -1962,6 +1968,7 @@ static const struct luaL_Reg tests_funcs[] = {
{"newstate", newstate},
{"newuserdata", newuserdata},
{"num2int", num2int},
+ {"makeseed", makeseed},
{"pushuserdata", pushuserdata},
{"querystr", string_query},
{"querytab", table_query},