diff options
author | Thomas Haller <thaller@redhat.com> | 2019-05-10 08:03:54 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-05-13 09:25:05 +0200 |
commit | 3712e7a89fd2efc9b0d2c09cda766d2357a63ba9 (patch) | |
tree | 854ec963e25bf83f717a7d8e12264c01cdb4b7d0 /shared/nm-glib-aux/nm-hash-utils.c | |
parent | 58df3f37ea031b77592e6879c7ccea61cbdfd5a0 (diff) | |
download | NetworkManager-3712e7a89fd2efc9b0d2c09cda766d2357a63ba9.tar.gz |
shared: use union instead of _nm_alignas() for static hash-seed
We want the the hash-seed array is alined so it can be used both as
guint, guint32, and guint64 directly. Don't use _nm_alignas() but
instead just add the fields to the union so we get proper alignment.
While at at, also let the seed argument to c_siphash_init() be aligned
to 64 integers. c_siphash_init() does not require that, but it tries to
read the seed as (unaligned) LE 64 bit integers. So, it doesn't hurt.
Diffstat (limited to 'shared/nm-glib-aux/nm-hash-utils.c')
-rw-r--r-- | shared/nm-glib-aux/nm-hash-utils.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/shared/nm-glib-aux/nm-hash-utils.c b/shared/nm-glib-aux/nm-hash-utils.c index 6e728e6b20..3ab39db712 100644 --- a/shared/nm-glib-aux/nm-hash-utils.c +++ b/shared/nm-glib-aux/nm-hash-utils.c @@ -45,7 +45,10 @@ _get_hash_key_init (void) * to use it as guint* or guint64* pointer. */ static union { guint8 v8[HASH_KEY_SIZE]; - } g_arr _nm_alignas (guint64); + guint _align_as_uint; + guint32 _align_as_uint32; + guint64 _align_as_uint64; + } g_arr; const guint8 *g; union { guint8 v8[HASH_KEY_SIZE]; @@ -125,14 +128,17 @@ void nm_hash_siphash42_init (CSipHash *h, guint static_seed) { const guint8 *g; - guint seed[HASH_KEY_SIZE_GUINT]; + union { + guint64 _align_as_uint64; + guint arr[HASH_KEY_SIZE_GUINT]; + } seed; nm_assert (h); g = _get_hash_key (); - memcpy (seed, g, HASH_KEY_SIZE); - seed[0] ^= static_seed; - c_siphash_init (h, (const guint8 *) seed); + memcpy (&seed, g, HASH_KEY_SIZE); + seed.arr[0] ^= static_seed; + c_siphash_init (h, (const guint8 *) &seed); } guint |