Commit c113544a authored by Nick Mathewson's avatar Nick Mathewson 🥔
Browse files

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

parents ca03b10b 732f522a
Loading
Loading
Loading
Loading

changes/bug15436

0 → 100644
+4 −0
Original line number Diff line number Diff line
  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
Original line number Diff line number Diff line
@@ -100,7 +100,15 @@ 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;
@@ -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;