From 1224206f400da2d34e813bbc113f929acd5e8aa9 Mon Sep 17 00:00:00 2001 From: "[anp/hsw]" Date: Fri, 16 Aug 2024 00:07:38 +0700 Subject: [PATCH] fixing -Wstrict-aliasing (part 1) --- tpws/helpers.c | 2 +- tpws/helpers.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tpws/helpers.c b/tpws/helpers.c index 08ec98f..0c6e24b 100644 --- a/tpws/helpers.c +++ b/tpws/helpers.c @@ -155,7 +155,7 @@ bool saconvmapped(struct sockaddr_storage *a) { if ((a->ss_family == AF_INET6) && saismapped((struct sockaddr_in6*)a)) { - uint32_t ip4 = *(uint32_t*)(((struct sockaddr_in6*)a)->sin6_addr.s6_addr+12); + uint32_t ip4 = IN6_EXTRACT_MAP4(((struct sockaddr_in6*)a)->sin6_addr.s6_addr); uint16_t port = ((struct sockaddr_in6*)a)->sin6_port; a->ss_family = AF_INET; ((struct sockaddr_in*)a)->sin_addr.s_addr = ip4; diff --git a/tpws/helpers.h b/tpws/helpers.h index 1989a14..f1383cb 100644 --- a/tpws/helpers.h +++ b/tpws/helpers.h @@ -59,3 +59,12 @@ bool pf_parse(const char *s, port_filter *pf); #ifndef IN_LOOPBACK #define IN_LOOPBACK(a) ((((uint32_t) (a)) & 0xff000000) == 0x7f000000) #endif + +#ifdef __GNUC__ +#define IN6_EXTRACT_MAP4(a) \ + (__extension__ \ + ({ const struct in6_addr *__a = (const struct in6_addr *) (a); \ + (((const uint32_t *) (__a))[3]); })) +#else +#define IN6_EXTRACT_MAP4(a) (((const uint32_t *) (a))[3]) +#endif