From a8b7ecd4dcb2b11d418ff57484c41ae62d1766ce Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 25 Feb 2020 09:43:22 +0100 Subject: [PATCH] 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. --- src/sample.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/sample.c b/src/sample.c index 0fb5f9aa7..3c6111224 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; }