diff --git a/ChangeLog b/ChangeLog index 4268eb75ad..50803702b1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2015-05-19 Paul Eggert + Steve Ellcey + + * inet/rcmd.c (rresvport_af): Change ss to anonymous union + in order to avoid strict alias warnings. + (iruserok_af): Ditto for ra. + 2015-05-19 James Lemke [BZ #17581] diff --git a/inet/rcmd.c b/inet/rcmd.c index acacaa0d8a..98b3735d1f 100644 --- a/inet/rcmd.c +++ b/inet/rcmd.c @@ -114,10 +114,10 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af) struct addrinfo hints, *res, *ai; union { - struct sockaddr sa; - struct sockaddr_storage ss; - struct sockaddr_in sin; - struct sockaddr_in6 sin6; + struct sockaddr sa; + struct sockaddr_storage ss; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; } from; struct pollfd pfd[2]; int32_t oldmask; @@ -374,7 +374,11 @@ rresvport_af(alport, family) int *alport; sa_family_t family; { - struct sockaddr_storage ss; + union { + struct sockaddr generic; + struct sockaddr_in in; + struct sockaddr_in6 in6; + } ss; int s; size_t len; uint16_t *sport; @@ -382,11 +386,11 @@ rresvport_af(alport, family) switch(family){ case AF_INET: len = sizeof(struct sockaddr_in); - sport = &((struct sockaddr_in *)&ss)->sin_port; + sport = &ss.in.sin_port; break; case AF_INET6: len = sizeof(struct sockaddr_in6); - sport = &((struct sockaddr_in6 *)&ss)->sin6_port; + sport = &ss.in6.sin6_port; break; default: __set_errno (EAFNOSUPPORT); @@ -398,9 +402,9 @@ rresvport_af(alport, family) memset (&ss, '\0', sizeof(ss)); #ifdef SALEN - ss.__ss_len = len; + ss.generic.__ss_len = len; #endif - ss.ss_family = family; + ss.generic.sa_family = family; /* Ignore invalid values. */ if (*alport < IPPORT_RESERVED / 2) @@ -411,7 +415,7 @@ rresvport_af(alport, family) int start = *alport; do { *sport = htons((uint16_t) *alport); - if (__bind(s, (struct sockaddr *)&ss, len) >= 0) + if (__bind(s, &ss.generic, len) >= 0) return s; if (errno != EADDRINUSE) { (void)__close(s); @@ -604,27 +608,29 @@ iruserok_af (raddr, superuser, ruser, luser, af) const char *ruser, *luser; sa_family_t af; { - struct sockaddr_storage ra; + union { + struct sockaddr generic; + struct sockaddr_in in; + struct sockaddr_in6 in6; + } ra; size_t ralen; memset (&ra, '\0', sizeof(ra)); switch (af){ case AF_INET: - ra.ss_family = AF_INET; - memcpy (&(((struct sockaddr_in *)&ra)->sin_addr), raddr, - sizeof(struct in_addr)); + ra.in.sin_family = AF_INET; + memcpy (&ra.in.sin_addr, raddr, sizeof(struct in_addr)); ralen = sizeof(struct sockaddr_in); break; case AF_INET6: - ra.ss_family = AF_INET6; - memcpy (&(((struct sockaddr_in6 *)&ra)->sin6_addr), raddr, - sizeof(struct in6_addr)); + ra.in6.sin6_family = AF_INET6; + memcpy (&ra.in6.sin6_addr, raddr, sizeof(struct in6_addr)); ralen = sizeof(struct sockaddr_in6); break; default: return 0; } - return ruserok_sa ((struct sockaddr *)&ra, ralen, superuser, ruser, luser); + return ruserok_sa (&ra.generic, ralen, superuser, ruser, luser); } libc_hidden_def (iruserok_af)