summaryrefslogtreecommitdiff
path: root/www/firefox/patches/patch-modules_woff2_src_woff2_common.cc
blob: 448b64300454957dd42df0479ca039164069af13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$NetBSD: patch-modules_woff2_src_woff2_common.cc,v 1.1 2016/12/09 11:51:09 martin Exp $

Use memcpy instead of dereferencing a pointer after casting it
to a type needing greater alignement on some architectures.

Firefox bug report:
	https://bugzilla.mozilla.org/show_bug.cgi?id=1322660

--- modules/woff2/src/woff2_common.cc.orig	2016-07-25 22:22:05.000000000 +0200
+++ modules/woff2/src/woff2_common.cc	2016-12-09 09:33:50.193846136 +0100
@@ -25,12 +25,13 @@
   uint32_t checksum = 0;
   size_t aligned_size = size & ~3;
   for (size_t i = 0; i < aligned_size; i += 4) {
+    uint32_t v;
+    memcpy(&v, buf + i, 4);
 #if (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
-    uint32_t v = *reinterpret_cast<const uint32_t*>(buf + i);
     checksum += (((v & 0xFF) << 24) | ((v & 0xFF00) << 8) |
       ((v & 0xFF0000) >> 8) | ((v & 0xFF000000) >> 24));
 #elif (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
-    checksum += *reinterpret_cast<const uint32_t*>(buf + i);
+    checksum += v;
 #else
     checksum += (buf[i] << 24) | (buf[i + 1] << 16) |
       (buf[i + 2] << 8) | buf[i + 3];