]> source.dussan.org Git - rspamd.git/commitdiff
Fix union usage.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 14 Apr 2015 15:40:59 +0000 (16:40 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 14 Apr 2015 15:40:59 +0000 (16:40 +0100)
src/libutil/util.c

index 506d5b0e04940d60bf177e2f013b98694e503aa2..221637597ca9772c7c9d107a13dba0f0ce91a1c5 100644 (file)
@@ -1261,11 +1261,13 @@ rspamd_strcase_equal (gconstpointer v, gconstpointer v2)
 static guint
 rspamd_icase_hash (const gchar *in, gsize len)
 {
-       guint leftover = len % 8;
+       guint leftover = len % 4;
        guint fp, i;
        const uint8_t* s = (const uint8_t*) in;
        union {
-               guchar c1, c2, c3, c4;
+               struct {
+                       guchar c1, c2, c3, c4;
+               } c;
                guint32 pp;
        } u;
        XXH64_state_t st;
@@ -1274,23 +1276,23 @@ rspamd_icase_hash (const gchar *in, gsize len)
        XXH64_reset (&st, 0xdeadbabe);
 
        for (i = 0; i != fp; i += 4) {
-               u.c1 = s[i], u.c2 = s[i + 1], u.c3 = s[i + 2], u.c4 = s[i + 3];
-               u.c1 = lc_map[u.c1];
-               u.c2 = lc_map[u.c2];
-               u.c3 = lc_map[u.c3];
-               u.c4 = lc_map[u.c4];
+               u.c.c1 = s[i], u.c.c2 = s[i + 1], u.c.c3 = s[i + 2], u.c.c4 = s[i + 3];
+               u.c.c1 = lc_map[u.c.c1];
+               u.c.c2 = lc_map[u.c.c2];
+               u.c.c3 = lc_map[u.c.c3];
+               u.c.c4 = lc_map[u.c.c4];
                XXH64_update (&st, &u.pp, sizeof (u));
        }
 
        u.pp = 0;
        switch (leftover) {
        case 3:
-               u.c3 = lc_map[(guchar)s[i++]];
+               u.c.c3 = lc_map[(guchar)s[i++]];
        case 2:
-               u.c2 = lc_map[(guchar)s[i++]];
+               u.c.c2 = lc_map[(guchar)s[i++]];
        case 1:
-               u.c1 = lc_map[(guchar)s[i]];
-               XXH64_update (&st, &u.pp, sizeof (u));
+               u.c.c1 = lc_map[(guchar)s[i]];
+               XXH64_update (&st, &u.pp, leftover);
                break;
        }