Merge pull request #113 from jwakely/patch-1

Fix aliasing violations in ip6_and
This commit is contained in:
bol-van 2022-06-08 19:35:13 +03:00 committed by GitHub
commit 1fcee44443
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -105,16 +105,12 @@ static inline const struct in6_addr *mask_from_bitcount6(uint32_t zct)
// result = a & b // result = a & b
static void ip6_and(const struct in6_addr *a, const struct in6_addr *b, struct in6_addr *result) static void ip6_and(const struct in6_addr *a, const struct in6_addr *b, struct in6_addr *result)
{ {
// POSSIBLE GCC COMPILER BUG . when using uint64_t and -O2/-O3 optimizations this function gets inlined with the wrong code and produces wrong results uint64_t a_addr[2], b_addr[2];
#if defined(__GNUC__) && !defined(__llvm__) && !defined(__NO_INLINE__) memcpy(a_addr, a->s6_addr, 16);
((uint32_t*)result->s6_addr)[0] = ((uint32_t*)a->s6_addr)[0] & ((uint32_t*)b->s6_addr)[0]; memcpy(b_addr, b->s6_addr, 16);
((uint32_t*)result->s6_addr)[1] = ((uint32_t*)a->s6_addr)[1] & ((uint32_t*)b->s6_addr)[1]; a_addr[0] &= b_addr[0];
((uint32_t*)result->s6_addr)[2] = ((uint32_t*)a->s6_addr)[2] & ((uint32_t*)b->s6_addr)[2]; a_addr[1] &= b_addr[1];
((uint32_t*)result->s6_addr)[3] = ((uint32_t*)a->s6_addr)[3] & ((uint32_t*)b->s6_addr)[3]; memcpy(result->s6_addr, a_addr, 16);
#else
((uint64_t*)result->s6_addr)[0] = ((uint64_t*)a->s6_addr)[0] & ((uint64_t*)b->s6_addr)[0];
((uint64_t*)result->s6_addr)[1] = ((uint64_t*)a->s6_addr)[1] & ((uint64_t*)b->s6_addr)[1];
#endif
} }
static void rtrim(char *s) static void rtrim(char *s)