|
@@ -8184,17 +8184,23 @@ mg_websocket_client_write(struct mg_connection *conn,
|
|
|
"Out of memory");
|
|
|
return -1;
|
|
|
}
|
|
|
- for (i = 0; i < dataLen - 3; i += 4) {
|
|
|
- *(uint32_t *)(void *)(masked_data + i) =
|
|
|
- *(uint32_t *)(void *)(data + i) ^ masking_key;
|
|
|
+
|
|
|
+ i = 0;
|
|
|
+ if (((ptrdiff_t)data % 4) == 0) {
|
|
|
+ /* Convert in 32 bit words, if data is 4 byte aligned */
|
|
|
+ while (i < (dataLen - 3)) {
|
|
|
+ *(uint32_t *)(void *)(masked_data + i) =
|
|
|
+ *(uint32_t *)(void *)(data + i) ^ masking_key;
|
|
|
+ i += 4;
|
|
|
+ }
|
|
|
}
|
|
|
if (i != dataLen) {
|
|
|
- /* convert 1-3 remaining bytes */
|
|
|
+ /* convert 1-3 remaining bytes if ((dataLen % 4) != 0)*/
|
|
|
i -= 4;
|
|
|
while (i < dataLen) {
|
|
|
*(uint8_t *)(void *)(masked_data + i) =
|
|
|
*(uint8_t *)(void *)(data + i)
|
|
|
- ^ *(((uint8_t *)&masking_key) + i);
|
|
|
+ ^ *(((uint8_t *)&masking_key) + (i % 4));
|
|
|
i++;
|
|
|
}
|
|
|
}
|