aboutsummaryrefslogtreecommitdiffstats
path: root/include/jemalloc/internal/hash.h
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2016-02-20 10:23:48 -0800
committerJason Evans <jasone@canonware.com>2016-02-20 10:23:48 -0800
commita0aaad1afa8c1c4b30bf15c6b8744084ffc32055 (patch)
tree55cc2ff4c7341e2460d73afe82ba22f6de2f8789 /include/jemalloc/internal/hash.h
parent9f24c944744e91d0cfe1864287ca7a52c16598fa (diff)
downloadplatform_external_jemalloc_new-a0aaad1afa8c1c4b30bf15c6b8744084ffc32055.tar.gz
platform_external_jemalloc_new-a0aaad1afa8c1c4b30bf15c6b8744084ffc32055.tar.bz2
platform_external_jemalloc_new-a0aaad1afa8c1c4b30bf15c6b8744084ffc32055.zip
Handle unaligned keys in hash().
Reported by Christopher Ferris <cferris@google.com>.
Diffstat (limited to 'include/jemalloc/internal/hash.h')
-rw-r--r--include/jemalloc/internal/hash.h18
1 files changed, 17 insertions, 1 deletions
diff --git a/include/jemalloc/internal/hash.h b/include/jemalloc/internal/hash.h
index bcead337..8b5fb037 100644
--- a/include/jemalloc/internal/hash.h
+++ b/include/jemalloc/internal/hash.h
@@ -1,6 +1,6 @@
/*
* The following hash function is based on MurmurHash3, placed into the public
- * domain by Austin Appleby. See http://code.google.com/p/smhasher/ for
+ * domain by Austin Appleby. See https://github.com/aappleby/smhasher for
* details.
*/
/******************************************************************************/
@@ -49,6 +49,14 @@ JEMALLOC_INLINE uint32_t
hash_get_block_32(const uint32_t *p, int i)
{
+ /* Handle unaligned read. */
+ if (unlikely((uintptr_t)p & (sizeof(uint32_t)-1)) != 0) {
+ uint32_t ret;
+
+ memcpy(&ret, &p[i], sizeof(uint32_t));
+ return (ret);
+ }
+
return (p[i]);
}
@@ -56,6 +64,14 @@ JEMALLOC_INLINE uint64_t
hash_get_block_64(const uint64_t *p, int i)
{
+ /* Handle unaligned read. */
+ if (unlikely((uintptr_t)p & (sizeof(uint64_t)-1)) != 0) {
+ uint64_t ret;
+
+ memcpy(&ret, &p[i], sizeof(uint64_t));
+ return (ret);
+ }
+
return (p[i]);
}