]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: sample: use read_u64() in ipmask() to apply an IPv6 mask
authorWilly Tarreau <w@1wt.eu>
Tue, 25 Feb 2020 08:43:22 +0000 (09:43 +0100)
committerWilly Tarreau <w@1wt.eu>
Tue, 25 Feb 2020 09:24:14 +0000 (10:24 +0100)
There were 8 strict aliasing warnings there due to the dereferences
casting to uint32_t of input and output. We can achieve the same using
two write_u64() and four read_u64() which do not cause this issue and
even let the compiler use 64-bit operations.

src/sample.c

index 0fb5f9aa799f89c34c701d8efc96a4ddc30b3529..3c611122404d83ca9f2086f0d939d996108d6bed 100644 (file)
@@ -22,6 +22,7 @@
 #include <common/hash.h>
 #include <common/http.h>
 #include <common/initcall.h>
+#include <common/net_helper.h>
 #include <common/standard.h>
 #include <common/uri_auth.h>
 #include <common/base64.h>
@@ -1750,10 +1751,10 @@ static int sample_conv_ipmask(const struct arg *args, struct sample *smp, void *
                if (args[1].type != ARGT_IPV6)
                        return 0;
 
-               *(uint32_t*)&smp->data.u.ipv6.s6_addr[0]  &= *(uint32_t*)&args[1].data.ipv6.s6_addr[0];
-               *(uint32_t*)&smp->data.u.ipv6.s6_addr[4]  &= *(uint32_t*)&args[1].data.ipv6.s6_addr[4];
-               *(uint32_t*)&smp->data.u.ipv6.s6_addr[8]  &= *(uint32_t*)&args[1].data.ipv6.s6_addr[8];
-               *(uint32_t*)&smp->data.u.ipv6.s6_addr[12] &= *(uint32_t*)&args[1].data.ipv6.s6_addr[12];
+               write_u64(&smp->data.u.ipv6.s6_addr[0],
+                         read_u64(&smp->data.u.ipv6.s6_addr[0]) & read_u64(&args[1].data.ipv6.s6_addr[0]));
+               write_u64(&smp->data.u.ipv6.s6_addr[8],
+                         read_u64(&smp->data.u.ipv6.s6_addr[8]) & read_u64(&args[1].data.ipv6.s6_addr[8]));
                smp->data.type = SMP_T_IPV6;
        }