* inet/rcmd.c (rresvport_af): Change ss to anonymous union

in order to avoid strict alias warnings.
	(iruserok_af): Ditto for ra.
This commit is contained in:
Steve Ellcey 2015-05-19 13:09:01 -07:00
parent 265cbed8e7
commit eb286115b1
2 changed files with 31 additions and 18 deletions

View File

@ -1,3 +1,10 @@
2015-05-19 Paul Eggert <eggert@cs.ucla.edu>
Steve Ellcey <sellcey@imgtec.com>
* 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 <jwlemke@codesourcery.com> 2015-05-19 James Lemke <jwlemke@codesourcery.com>
[BZ #17581] [BZ #17581]

View File

@ -114,10 +114,10 @@ rcmd_af(ahost, rport, locuser, remuser, cmd, fd2p, af)
struct addrinfo hints, *res, *ai; struct addrinfo hints, *res, *ai;
union union
{ {
struct sockaddr sa; struct sockaddr sa;
struct sockaddr_storage ss; struct sockaddr_storage ss;
struct sockaddr_in sin; struct sockaddr_in sin;
struct sockaddr_in6 sin6; struct sockaddr_in6 sin6;
} from; } from;
struct pollfd pfd[2]; struct pollfd pfd[2];
int32_t oldmask; int32_t oldmask;
@ -374,7 +374,11 @@ rresvport_af(alport, family)
int *alport; int *alport;
sa_family_t family; sa_family_t family;
{ {
struct sockaddr_storage ss; union {
struct sockaddr generic;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} ss;
int s; int s;
size_t len; size_t len;
uint16_t *sport; uint16_t *sport;
@ -382,11 +386,11 @@ rresvport_af(alport, family)
switch(family){ switch(family){
case AF_INET: case AF_INET:
len = sizeof(struct sockaddr_in); len = sizeof(struct sockaddr_in);
sport = &((struct sockaddr_in *)&ss)->sin_port; sport = &ss.in.sin_port;
break; break;
case AF_INET6: case AF_INET6:
len = sizeof(struct sockaddr_in6); len = sizeof(struct sockaddr_in6);
sport = &((struct sockaddr_in6 *)&ss)->sin6_port; sport = &ss.in6.sin6_port;
break; break;
default: default:
__set_errno (EAFNOSUPPORT); __set_errno (EAFNOSUPPORT);
@ -398,9 +402,9 @@ rresvport_af(alport, family)
memset (&ss, '\0', sizeof(ss)); memset (&ss, '\0', sizeof(ss));
#ifdef SALEN #ifdef SALEN
ss.__ss_len = len; ss.generic.__ss_len = len;
#endif #endif
ss.ss_family = family; ss.generic.sa_family = family;
/* Ignore invalid values. */ /* Ignore invalid values. */
if (*alport < IPPORT_RESERVED / 2) if (*alport < IPPORT_RESERVED / 2)
@ -411,7 +415,7 @@ rresvport_af(alport, family)
int start = *alport; int start = *alport;
do { do {
*sport = htons((uint16_t) *alport); *sport = htons((uint16_t) *alport);
if (__bind(s, (struct sockaddr *)&ss, len) >= 0) if (__bind(s, &ss.generic, len) >= 0)
return s; return s;
if (errno != EADDRINUSE) { if (errno != EADDRINUSE) {
(void)__close(s); (void)__close(s);
@ -604,27 +608,29 @@ iruserok_af (raddr, superuser, ruser, luser, af)
const char *ruser, *luser; const char *ruser, *luser;
sa_family_t af; sa_family_t af;
{ {
struct sockaddr_storage ra; union {
struct sockaddr generic;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} ra;
size_t ralen; size_t ralen;
memset (&ra, '\0', sizeof(ra)); memset (&ra, '\0', sizeof(ra));
switch (af){ switch (af){
case AF_INET: case AF_INET:
ra.ss_family = AF_INET; ra.in.sin_family = AF_INET;
memcpy (&(((struct sockaddr_in *)&ra)->sin_addr), raddr, memcpy (&ra.in.sin_addr, raddr, sizeof(struct in_addr));
sizeof(struct in_addr));
ralen = sizeof(struct sockaddr_in); ralen = sizeof(struct sockaddr_in);
break; break;
case AF_INET6: case AF_INET6:
ra.ss_family = AF_INET6; ra.in6.sin6_family = AF_INET6;
memcpy (&(((struct sockaddr_in6 *)&ra)->sin6_addr), raddr, memcpy (&ra.in6.sin6_addr, raddr, sizeof(struct in6_addr));
sizeof(struct in6_addr));
ralen = sizeof(struct sockaddr_in6); ralen = sizeof(struct sockaddr_in6);
break; break;
default: default:
return 0; 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) libc_hidden_def (iruserok_af)