From: Willy Tarreau Date: Tue, 25 Feb 2020 08:43:22 +0000 (+0100) Subject: CLEANUP: sample: use read_u64() in ipmask() to apply an IPv6 mask X-Git-Tag: v2.2-dev3~15 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a8b7ecd4dcb2b11d418ff57484c41ae62d1766ce;p=thirdparty%2Fhaproxy.git CLEANUP: sample: use read_u64() in ipmask() to apply an IPv6 mask 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. --- diff --git a/src/sample.c b/src/sample.c index 0fb5f9aa79..3c61112240 100644 --- a/src/sample.c +++ b/src/sample.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -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; }