|
@@ -8154,17 +8154,30 @@ mg_websocket_client_write(struct mg_connection *conn,
|
|
|
int retval = -1;
|
|
|
size_t i = 0;
|
|
|
static uint64_t lfsr = 0;
|
|
|
+ static uint64_t lcg = 0;
|
|
|
uint32_t masking_key;
|
|
|
char *masked_data = (char *)mg_malloc(((dataLen + 7) / 4) * 4);
|
|
|
+ struct timespec now;
|
|
|
+
|
|
|
+ memset(&now, 0, sizeof(now));
|
|
|
+ clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
|
|
|
if (lfsr == 0) {
|
|
|
- lfsr = (uint64_t)time(NULL);
|
|
|
+ lfsr = (((uint64_t)now.tv_sec) << 21) ^ (uint64_t)now.tv_nsec
|
|
|
+ ^ (uint64_t)&dataLen;
|
|
|
} else {
|
|
|
lfsr = (lfsr >> 1)
|
|
|
| ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1)
|
|
|
<< 63);
|
|
|
}
|
|
|
- masking_key = (uint32_t)lfsr;
|
|
|
+ if (lcg == 0) {
|
|
|
+ lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec
|
|
|
+ + (uint64_t)data;
|
|
|
+ } else {
|
|
|
+ lcg = lcg * 6364136223846793005 + 1442695040888963407;
|
|
|
+ }
|
|
|
+
|
|
|
+ masking_key = (uint32_t)lfsr ^ (uint32_t)lcg ^ now.tv_nsec;
|
|
|
|
|
|
if (masked_data == NULL) {
|
|
|
/* Return -1 in an error case */
|