Browse Source

Websockent client: do 32 bit xor mask only if data is 4 byte aligned im memory (clean merge #210)

bel 9 năm trước cách đây
mục cha
commit
62899cbd09
1 tập tin đã thay đổi với 11 bổ sung5 xóa
  1. 11 5
      src/civetweb.c

+ 11 - 5
src/civetweb.c

@@ -8184,17 +8184,23 @@ mg_websocket_client_write(struct mg_connection *conn,
 		       "Out of memory");
 		       "Out of memory");
 		return -1;
 		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) {
 	if (i != dataLen) {
-		/* convert 1-3 remaining bytes */
+		/* convert 1-3 remaining bytes if ((dataLen % 4) != 0)*/
 		i -= 4;
 		i -= 4;
 		while (i < dataLen) {
 		while (i < dataLen) {
 			*(uint8_t *)(void *)(masked_data + i) =
 			*(uint8_t *)(void *)(masked_data + i) =
 			    *(uint8_t *)(void *)(data + i)
 			    *(uint8_t *)(void *)(data + i)
-			    ^ *(((uint8_t *)&masking_key) + i);
+			    ^ *(((uint8_t *)&masking_key) + (i % 4));
 			i++;
 			i++;
 		}
 		}
 	}
 	}