Browse Source

Merge remote-tracking branch 'public/bug15436_025' into maint-0.2.6

Nick Mathewson 9 years ago
parent
commit
c113544a94
2 changed files with 17 additions and 3 deletions
  1. 4 0
      changes/bug15436
  2. 13 3
      src/ext/csiphash.c

+ 4 - 0
changes/bug15436

@@ -0,0 +1,4 @@
+  o Minor bugfixes (portability):
+    - Use the correct datatype in the SipHash-2-4 function to prevent compilers
+      from assuming any sort of alignment.  Fixes bug 15436; bugfix on
+      0.2.5.3-alpha.

+ 13 - 3
src/ext/csiphash.c

@@ -100,10 +100,18 @@ uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *k
 	uint64_t k0 = key->k0;
 	uint64_t k1 = key->k1;
 	uint64_t b = (uint64_t)src_sz << 56;
+#ifdef UNALIGNED_OK
 	const uint64_t *in = (uint64_t*)src;
+#else
+	/* On platforms where alignment matters, if 'in' is a pointer to a
+	 * datatype that must be aligned, the compiler is allowed to
+	 * generate code that assumes that it is aligned as such.
+	 */
+	const uint8_t *in = (uint8_t *)src;
+#endif
 
-        uint64_t t;
-        uint8_t *pt, *m;
+	uint64_t t;
+	uint8_t *pt, *m;
 
 	uint64_t v0 = k0 ^ 0x736f6d6570736575ULL;
 	uint64_t v1 = k1 ^ 0x646f72616e646f6dULL;
@@ -113,12 +121,14 @@ uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *k
 	while (src_sz >= 8) {
 #ifdef UNALIGNED_OK
 		uint64_t mi = _le64toh(*in);
+		in += 1;
 #else
 		uint64_t mi;
 		memcpy(&mi, in, 8);
 		mi = _le64toh(mi);
+		in += 8;
 #endif
-		in += 1; src_sz -= 8;
+		src_sz -= 8;
 		v3 ^= mi;
 		DOUBLE_ROUND(v0,v1,v2,v3);
 		v0 ^= mi;