From 7452507f7d1cfe4feaf9589fe53125ef73709a9f Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Tue, 12 Mar 2019 07:04:49 +0100 Subject: [PATCH] udp: use sockaddr_storage instead of union MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/libuv/libuv/pull/2202 Reviewed-By: Saúl Ibarra Corretgé --- src/unix/udp.c | 33 +++++++++++++++++++-------------- src/win/udp.c | 33 +++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/unix/udp.c b/src/unix/udp.c index 7e4095c6..10e6f55d 100644 --- a/src/unix/udp.c +++ b/src/unix/udp.c @@ -847,35 +847,40 @@ int uv_udp_set_source_membership(uv_udp_t* handle, const char* source_addr, uv_membership membership) { int err; - union sockaddr { - struct sockaddr_in sa_in; - struct sockaddr_in6 sa_in6; - }; + struct sockaddr_storage mcast_addr; + struct sockaddr_in* mcast_addr4; + struct sockaddr_in6* mcast_addr6; + struct sockaddr_storage src_addr; + struct sockaddr_in* src_addr4; + struct sockaddr_in6* src_addr6; - union sockaddr mcast_addr; - union sockaddr src_addr; + mcast_addr4 = (struct sockaddr_in*)&mcast_addr; + mcast_addr6 = (struct sockaddr_in6*)&mcast_addr; + src_addr4 = (struct sockaddr_in*)&src_addr; + src_addr6 = (struct sockaddr_in6*)&src_addr; - err = uv_ip4_addr(multicast_addr, 0, &mcast_addr.sa_in); + err = uv_ip4_addr(multicast_addr, 0, mcast_addr4); if (err) { - err = uv_ip6_addr(multicast_addr, 0, &mcast_addr.sa_in6); + err = uv_ip6_addr(multicast_addr, 0, mcast_addr6); if (err) return err; - err = uv_ip6_addr(source_addr, 0, &src_addr.sa_in6); + err = uv_ip6_addr(source_addr, 0, src_addr6); if (err) return err; return uv__udp_set_source_membership6(handle, - &mcast_addr.sa_in6, + mcast_addr6, interface_addr, - &src_addr.sa_in6, + src_addr6, membership); } - err = uv_ip4_addr(source_addr, 0, &src_addr.sa_in); + + err = uv_ip4_addr(source_addr, 0, src_addr4); if (err) return err; return uv__udp_set_source_membership4(handle, - &mcast_addr.sa_in, + mcast_addr4, interface_addr, - &src_addr.sa_in, + src_addr4, membership); } diff --git a/src/win/udp.c b/src/win/udp.c index 3e74274b..3daa55f6 100644 --- a/src/win/udp.c +++ b/src/win/udp.c @@ -830,35 +830,40 @@ int uv_udp_set_source_membership(uv_udp_t* handle, const char* source_addr, uv_membership membership) { int err; - union sockaddr { - struct sockaddr_in sa_in; - struct sockaddr_in6 sa_in6; - }; + struct sockaddr_storage mcast_addr; + struct sockaddr_in* mcast_addr4; + struct sockaddr_in6* mcast_addr6; + struct sockaddr_storage src_addr; + struct sockaddr_in* src_addr4; + struct sockaddr_in6* src_addr6; - union sockaddr mcast_addr; - union sockaddr src_addr; + mcast_addr4 = (struct sockaddr_in*)&mcast_addr; + mcast_addr6 = (struct sockaddr_in6*)&mcast_addr; + src_addr4 = (struct sockaddr_in*)&src_addr; + src_addr6 = (struct sockaddr_in6*)&src_addr; - err = uv_ip4_addr(multicast_addr, 0, &mcast_addr.sa_in); + err = uv_ip4_addr(multicast_addr, 0, mcast_addr4); if (err) { - err = uv_ip6_addr(multicast_addr, 0, &mcast_addr.sa_in6); + err = uv_ip6_addr(multicast_addr, 0, mcast_addr6); if (err) return err; - err = uv_ip6_addr(source_addr, 0, &src_addr.sa_in6); + err = uv_ip6_addr(source_addr, 0, src_addr6); if (err) return err; return uv__udp_set_source_membership6(handle, - &mcast_addr.sa_in6, + mcast_addr6, interface_addr, - &src_addr.sa_in6, + src_addr6, membership); } - err = uv_ip4_addr(source_addr, 0, &src_addr.sa_in); + + err = uv_ip4_addr(source_addr, 0, src_addr4); if (err) return err; return uv__udp_set_source_membership4(handle, - &mcast_addr.sa_in, + mcast_addr4, interface_addr, - &src_addr.sa_in, + src_addr4, membership); }