|  | @@ -338,8 +338,9 @@ static char *mg_fgets(char *buf, size_t size, struct file *filep, char **p);
 | 
	
		
			
				|  |  |  #if defined(HAVE_STDINT)
 | 
	
		
			
				|  |  |  #include <stdint.h>
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -typedef unsigned int uint32_t;
 | 
	
		
			
				|  |  | +typedef unsigned char uint8_t;
 | 
	
		
			
				|  |  |  typedef unsigned short uint16_t;
 | 
	
		
			
				|  |  | +typedef unsigned int uint32_t;
 | 
	
		
			
				|  |  |  typedef unsigned __int64 uint64_t;
 | 
	
		
			
				|  |  |  typedef __int64 int64_t;
 | 
	
		
			
				|  |  |  #define INT64_MAX (9223372036854775807)
 | 
	
	
		
			
				|  | @@ -8153,10 +8154,10 @@ mg_websocket_client_write(struct mg_connection *conn,
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	int retval = -1;
 | 
	
		
			
				|  |  |  	size_t i = 0;
 | 
	
		
			
				|  |  | +	char *masked_data = (char *)mg_malloc(((dataLen + 7) / 4) * 4);
 | 
	
		
			
				|  |  | +	uint32_t masking_key;
 | 
	
		
			
				|  |  |  	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));
 | 
	
	
		
			
				|  | @@ -8165,15 +8166,12 @@ mg_websocket_client_write(struct mg_connection *conn,
 | 
	
		
			
				|  |  |  	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);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	if (lcg == 0) {
 | 
	
		
			
				|  |  | -		lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec
 | 
	
		
			
				|  |  | -		      + (uint64_t)data;
 | 
	
		
			
				|  |  | -	} else {
 | 
	
		
			
				|  |  |  		lcg = lcg * 6364136223846793005 + 1442695040888963407;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -8186,10 +8184,20 @@ mg_websocket_client_write(struct mg_connection *conn,
 | 
	
		
			
				|  |  |  		       "Out of memory");
 | 
	
		
			
				|  |  |  		return -1;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	for (i = 0; i < dataLen; i += 4) {
 | 
	
		
			
				|  |  | +	for (i = 0; i < dataLen - 3; i += 4) {
 | 
	
		
			
				|  |  |  		*(uint32_t *)(void *)(masked_data + i) =
 | 
	
		
			
				|  |  |  		    *(uint32_t *)(void *)(data + i) ^ masking_key;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	if (i != dataLen) {
 | 
	
		
			
				|  |  | +		/* convert 1-3 remaining bytes */
 | 
	
		
			
				|  |  | +		i -= 4;
 | 
	
		
			
				|  |  | +		while (i < dataLen) {
 | 
	
		
			
				|  |  | +			*(uint8_t *)(void *)(masked_data + i) =
 | 
	
		
			
				|  |  | +			    *(uint8_t *)(void *)(data + i)
 | 
	
		
			
				|  |  | +			    ^ *(((uint8_t *)&masking_key) + i);
 | 
	
		
			
				|  |  | +			i++;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	/* TODO (high): Deal with ((dataLen % 4) != 0) and misalignment */
 | 
	
		
			
				|  |  |  	retval = mg_websocket_write_exec(
 | 
	
		
			
				|  |  |  	    conn, opcode, masked_data, dataLen, masking_key);
 |