diff --git a/src/civetweb.c b/src/civetweb.c index d0674d78..2c92ae11 100755 --- a/src/civetweb.c +++ b/src/civetweb.c @@ -1571,6 +1571,33 @@ mg_snprintf(const struct mg_connection *conn, va_end(ap); } + +static int64_t +get_random(void) +{ + static uint64_t lfsr = 0; + static uint64_t lcg = 0; + struct timespec now; + + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &now); + + if (lfsr == 0) { + lfsr = (((uint64_t)now.tv_sec) << 21) ^ (uint64_t)now.tv_nsec + ^ (uint64_t)(ptrdiff_t)&now; + lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec + + (uint64_t)(ptrdiff_t)&now; + } else { + lfsr = (lfsr >> 1) + | ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1) + << 63); + lcg = lcg * 6364136223846793005 + 1442695040888963407; + } + + return (lfsr ^ lcg ^ now.tv_nsec); +} + + static int get_option_index(const char *name) { @@ -8262,27 +8289,7 @@ mg_websocket_client_write(struct mg_connection *conn, { int retval = -1; char *masked_data = (char *)mg_malloc(((dataLen + 7) / 4) * 4); - uint32_t masking_key; - static uint64_t lfsr = 0; - static uint64_t lcg = 0; - struct timespec now; - - memset(&now, 0, sizeof(now)); - clock_gettime(CLOCK_MONOTONIC, &now); - - if (lfsr == 0) { - lfsr = (((uint64_t)now.tv_sec) << 21) ^ (uint64_t)now.tv_nsec - ^ (uint64_t)&dataLen; - lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec - + (uint64_t)data; - } else { - lfsr = (lfsr >> 1) - | ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1) - << 63); - lcg = lcg * 6364136223846793005 + 1442695040888963407; - } - - masking_key = (uint32_t)lfsr ^ (uint32_t)lcg ^ (uint32_t)now.tv_nsec; + uint32_t masking_key = (uint32_t)get_random(); if (masked_data == NULL) { /* Return -1 in an error case */ @@ -11852,6 +11859,9 @@ mg_start(const struct mg_callbacks *callbacks, return NULL; } + /* Random number generator will initialize at the first call */ + (void)get_random(); + if (mg_atomic_inc(&sTlsInit) == 1) { #if defined(_WIN32) && !defined(__SYMBIAN32__)