diff options
| author | Darren Reed <Darren.Reed@Oracle.COM> | 2010-07-09 21:00:59 -0700 |
|---|---|---|
| committer | Darren Reed <Darren.Reed@Oracle.COM> | 2010-07-09 21:00:59 -0700 |
| commit | 64639aaf7beb84086b88f186ea1fa9ccf0be8c57 (patch) | |
| tree | 1c189cfff212c6e13f229c55a5b6c1842bb7a168 /usr/src/cmd | |
| parent | f9e0b1dc6f25356fd35837dc9e1124b2d91ed6f3 (diff) | |
| download | illumos-joyent-64639aaf7beb84086b88f186ea1fa9ccf0be8c57.tar.gz | |
6950944 ifa_addr and friends should be "sockaddr", not "sockaddr_storage"
Diffstat (limited to 'usr/src/cmd')
| -rw-r--r-- | usr/src/cmd/cmd-inet/lib/nwamd/conditions.c | 12 | ||||
| -rw-r--r-- | usr/src/cmd/cmd-inet/lib/nwamd/ncu_ip.c | 51 | ||||
| -rw-r--r-- | usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c | 5 | ||||
| -rw-r--r-- | usr/src/cmd/cmd-inet/usr.lib/vrrpd/vrrpd.c | 6 | ||||
| -rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c | 12 | ||||
| -rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c | 2 | ||||
| -rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/nwamadm/nwamadm.c | 2 | ||||
| -rw-r--r-- | usr/src/cmd/rcm_daemon/common/ip_rcm.c | 7 | ||||
| -rw-r--r-- | usr/src/cmd/zoneadmd/vplat.c | 2 |
9 files changed, 62 insertions, 37 deletions
diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/conditions.c b/usr/src/cmd/cmd-inet/lib/nwamd/conditions.c index 25c5643382..a93259fed3 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/conditions.c +++ b/usr/src/cmd/cmd-inet/lib/nwamd/conditions.c @@ -441,17 +441,19 @@ static int check_ipaddr(sa_family_t family, struct ifaddrs *ifa, void *arg) { struct nwamd_ipaddr_condition_walk_arg *wa = arg; + struct sockaddr_in6 addr6; + struct sockaddr_in addr; boolean_t match = B_FALSE; uchar_t *addr1, *addr2; if (family == AF_INET) { - addr1 = (uchar_t *)&(((struct sockaddr_in *) - ifa->ifa_addr)->sin_addr.s_addr); + (void) memcpy(&addr, ifa->ifa_addr, sizeof (addr)); + addr1 = (uchar_t *)(&addr.sin_addr.s_addr); addr2 = (uchar_t *)&(((struct sockaddr_in *) &(wa->sockaddr))->sin_addr.s_addr); } else { - addr1 = (uchar_t *)&(((struct sockaddr_in6 *) - ifa->ifa_addr)->sin6_addr.s6_addr); + (void) memcpy(&addr6, ifa->ifa_addr, sizeof (addr6)); + addr1 = (uchar_t *)(&addr6.sin6_addr.s6_addr); addr2 = (uchar_t *)&(((struct sockaddr_in6 *) &(wa->sockaddr))->sin6_addr.s6_addr); } @@ -535,7 +537,7 @@ test_condition_ip_address(nwam_condition_t condition, return (wa.res); } for (ifap = ifa; ifap != NULL; ifap = ifap->ifa_next) { - if (ifap->ifa_addr->ss_family != family) + if (ifap->ifa_addr->sa_family != family) continue; if (check_ipaddr(family, ifap, &wa) == 1) break; diff --git a/usr/src/cmd/cmd-inet/lib/nwamd/ncu_ip.c b/usr/src/cmd/cmd-inet/lib/nwamd/ncu_ip.c index f9d90ccafe..1953be609f 100644 --- a/usr/src/cmd/cmd-inet/lib/nwamd/ncu_ip.c +++ b/usr/src/cmd/cmd-inet/lib/nwamd/ncu_ip.c @@ -371,7 +371,7 @@ nwamd_static_addresses_configured(nwamd_ncu_t *ncu, sa_family_t family) boolean_t nwamd_dhcp_managing(int protocol, nwamd_ncu_t *ncu) { - struct sockaddr_storage *addr; + struct sockaddr_storage addr; uint64_t flags; boolean_t rv = B_FALSE; ipadm_addr_info_t *addrinfo, *a; @@ -386,9 +386,19 @@ nwamd_dhcp_managing(int protocol, nwamd_ncu_t *ncu) } for (a = addrinfo; a != NULL; a = IA_NEXT(a)) { + /* + * WARNING: This memcpy() assumes knowledge of the + * implementation of getifaddrs() and that it always + * uses sockaddr_storage as the backing store for + * address information, thus making it possible to + * copy the entire structure rather than do it on + * the size of the sockaddr according to family. + * This assumption is made elsewhere in this file. + */ + (void) memcpy(&addr, a->ia_ifa.ifa_addr, sizeof (addr)); + /* is this address an expected static one? */ - addr = a->ia_ifa.ifa_addr; - if (find_static_address(addr, ncu) != NULL) + if (find_static_address(&addr, ncu) != NULL) continue; /* @@ -400,11 +410,11 @@ nwamd_dhcp_managing(int protocol, nwamd_ncu_t *ncu) * as not being managed by DHCP and skip checking of flags. */ if ((protocol == AF_INET && - ((struct sockaddr_in *)addr)->sin_addr.s_addr == + ((struct sockaddr_in *)&addr)->sin_addr.s_addr == INADDR_ANY) || (protocol == AF_INET6 && IN6_IS_ADDR_LINKLOCAL( - &((struct sockaddr_in6 *)addr)->sin6_addr))) { + &((struct sockaddr_in6 *)&addr)->sin6_addr))) { continue; } @@ -561,7 +571,7 @@ stateless_running(const nwamd_ncu_t *ncu) } for (ainfop = ainfo; ainfop != NULL; ainfop = IA_NEXT(ainfop)) { - if (ainfop->ia_ifa.ifa_addr->ss_family != AF_INET6) + if (ainfop->ia_ifa.ifa_addr->sa_family != AF_INET6) continue; flags = ainfop->ia_ifa.ifa_flags; if (flags & STATELESS_RUNNING) { @@ -594,11 +604,14 @@ addrinfo_for_addr(const struct sockaddr_storage *caddr, const char *ifname, *ainfo = NULL; for (ainfop = addrinfo; ainfop != NULL; ainfop = IA_NEXT(ainfop)) { + struct sockaddr_storage addr; + + (void) memcpy(&addr, ainfop->ia_ifa.ifa_addr, sizeof (addr)); /* * If addresses match, rearrange pointers so that addrinfo * does not contain a, and return a. */ - if (sockaddrcmp(ainfop->ia_ifa.ifa_addr, caddr)) { + if (sockaddrcmp(&addr, caddr)) { if (last != NULL) last->ia_ifa.ifa_next = ainfop->ia_ifa.ifa_next; else @@ -840,7 +853,7 @@ nwamd_ncu_handle_if_state_event(nwamd_event_t event) boolean_t stateful_ai_found = B_FALSE; struct nwamd_if_address *nifa = NULL; nwamd_if_t *u_if; - struct sockaddr_storage *addr, *ai_addr = 0; + struct sockaddr_storage *addr, ai_addr, *aip = NULL; ushort_t family; uint64_t flags = 0; @@ -874,7 +887,9 @@ nwamd_ncu_handle_if_state_event(nwamd_event_t event) } addrinfo = ai; flags = addrinfo->ia_ifa.ifa_flags; - ai_addr = addrinfo->ia_ifa.ifa_addr; + (void) memcpy(&ai_addr, addrinfo->ia_ifa.ifa_addr, + sizeof (ai_addr)); + aip = &ai_addr; if (addrinfo->ia_atype == IPADM_ADDR_IPV6_ADDRCONF || addrinfo->ia_atype == IPADM_ADDR_DHCP) @@ -936,16 +951,22 @@ nwamd_ncu_handle_if_state_event(nwamd_event_t event) &ai)) { ipadm_addr_info_t *a; for (a = ai; a != NULL; a = IA_NEXT(a)) { + struct sockaddr_storage stor; + + (void) memcpy(&stor, a->ia_ifa.ifa_addr, + sizeof (stor)); /* * Since multiple addrinfo can have * the same ipaddr, find the one for * the address that generated this * state event. */ - if (sockaddrcmp(addr, - a->ia_ifa.ifa_addr)) { + if (sockaddrcmp(addr, &stor)) { flags = a->ia_ifa.ifa_flags; - ai_addr = a->ia_ifa.ifa_addr; + (void) memcpy(&ai_addr, + a->ia_ifa.ifa_addr, + sizeof (ai_addr)); + aip = &ai_addr; addrinfo = a; } /* @@ -981,10 +1002,10 @@ nwamd_ncu_handle_if_state_event(nwamd_event_t event) * interfaces). */ if (((struct sockaddr_in *)addr)->sin_addr.s_addr - == INADDR_ANY && ai_addr != 0) { + == INADDR_ANY && aip != 0) { struct sockaddr_in *a; char astr[INET6_ADDRSTRLEN]; - a = (struct sockaddr_in *)ai_addr; + a = (struct sockaddr_in *)aip; if ((flags & IFF_UP) && !(flags & IFF_RUNNING) && @@ -1026,7 +1047,7 @@ nwamd_ncu_handle_if_state_event(nwamd_event_t event) * in that case. */ if (!addr_added && !(flags & IFF_DUPLICATE)) { - if (ai_addr != 0 && sockaddrcmp(addr, ai_addr)) { + if (aip != 0 && sockaddrcmp(addr, aip)) { nlog(LOG_INFO, "nwamd_ncu_handle_if_state_event: " "address %s is not really gone from %s, " diff --git a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c index 62ba4df299..17e6c50da6 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c +++ b/usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c @@ -18,8 +18,7 @@ * * CDDL HEADER END * - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. */ #include "defs.h" @@ -2580,7 +2579,7 @@ phyint_check_ipadm_intfid(struct phyint *pi) pi->pi_autoconf = _B_TRUE; for (ainfop = addrinfo; ainfop != NULL; ainfop = IA_NEXT(ainfop)) { ifap = &ainfop->ia_ifa; - if (ifap->ifa_addr->ss_family != AF_INET6 || + if (ifap->ifa_addr->sa_family != AF_INET6 || ainfop->ia_state == IFA_DISABLED) continue; sin6 = (struct sockaddr_in6 *)ifap->ifa_addr; diff --git a/usr/src/cmd/cmd-inet/usr.lib/vrrpd/vrrpd.c b/usr/src/cmd/cmd-inet/usr.lib/vrrpd/vrrpd.c index 223c5e4916..a319c119a6 100644 --- a/usr/src/cmd/cmd-inet/usr.lib/vrrpd/vrrpd.c +++ b/usr/src/cmd/cmd-inet/usr.lib/vrrpd/vrrpd.c @@ -1559,6 +1559,7 @@ vrrpd_walk_addr_info(int af) ipadm_addr_info_t *ainfo, *ainfop; ipadm_status_t ipstatus; char *lifname; + struct sockaddr_storage stor; vrrp_addr_t *addr; int ifindex; uint64_t flags; @@ -1574,12 +1575,13 @@ vrrpd_walk_addr_info(int af) } for (ainfop = ainfo; ainfop != NULL; ainfop = IA_NEXT(ainfop)) { - if (ainfop->ia_ifa.ifa_addr->ss_family != af) + if (ainfop->ia_ifa.ifa_addr->sa_family != af) continue; lifname = ainfop->ia_ifa.ifa_name; flags = ainfop->ia_ifa.ifa_flags; - addr = (vrrp_addr_t *)ainfop->ia_ifa.ifa_addr; + (void) memcpy(&stor, ainfop->ia_ifa.ifa_addr, sizeof (stor)); + addr = (vrrp_addr_t *)&stor; vrrp_log(VRRP_DBG0, "vrrpd_walk_addr_info(%s): %s", af_str(af), lifname); diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c index a2b477c06b..63661b0301 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c @@ -552,7 +552,7 @@ foreachinterface(int argc, char *argv[], int af, if ((~ifa->ifa_flags & offflags) != offflags) continue; } - s = (ifa->ifa_addr->ss_family == AF_INET ? s4 : s6); + s = (ifa->ifa_addr->sa_family == AF_INET ? s4 : s6); (void) strncpy(name, ifa->ifa_name, sizeof (name)); (void) strncpy(origname, name, sizeof (origname)); ifconfig(argc, argv, af, ifa); @@ -805,7 +805,7 @@ ifconfig(int argc, char *argv[], int af, struct ifaddrs *ifa) */ if ((p->c_af == AF_ANY) || (ifa == NULL) || - (ifa->ifa_addr->ss_family == p->c_af)) { + (ifa->ifa_addr->sa_family == p->c_af)) { ret = (*p->c_func)(*argv, p->c_parameter); /* * If c_func failed and we should @@ -1000,7 +1000,7 @@ setifaddr(char *addr, int64_t param) * lifr.lifr_addr, which is updated by set_mask_lifreq() * will contain the right mask to use. */ - prefixlen = mask2plen(&lifr.lifr_addr); + prefixlen = mask2plen((struct sockaddr *)&lifr.lifr_addr); (void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d", addrstr, prefixlen); @@ -1921,7 +1921,8 @@ addif(char *str, int64_t param) * lifr.lifr_addr, which is updated by set_mask_lifreq() * will contain the right mask to use. */ - prefixlen = mask2plen(&lifr.lifr_addr); + prefixlen = mask2plen((struct sockaddr *)&lifr.lifr_addr); + (void) snprintf(cidraddr, sizeof (cidraddr), "%s/%d", addrstr, prefixlen); @@ -2002,7 +2003,8 @@ removeif(char *str, int64_t param) ipadmerr_exit(istatus, "removeif"); for (ainfop = ainfo; ainfop != NULL; ainfop = IA_NEXT(ainfop)) - if (sockaddrcmp(ainfop->ia_ifa.ifa_addr, &laddr)) + if (sockaddrcmp( + (struct sockaddr_storage *)ainfop->ia_ifa.ifa_addr, &laddr)) break; if (ainfop != NULL) { diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c b/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c index a3b2fcd19e..5e6712f0c0 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c @@ -1718,7 +1718,7 @@ print_sa_cb(ofmt_arg_t *ofarg, char *buf, uint_t bufsize) flags2str(ainfo->ia_pflags, pflags_mask, _B_TRUE, buf, bufsize); break; case SA_ADDR: - af = ifa->ifa_addr->ss_family; + af = ifa->ifa_addr->sa_family; /* * If the address is 0.0.0.0 or :: and the origin is DHCP, * print STR_UNKNOWN_VAL. diff --git a/usr/src/cmd/cmd-inet/usr.sbin/nwamadm/nwamadm.c b/usr/src/cmd/cmd-inet/usr.sbin/nwamadm/nwamadm.c index 5f348bd2bb..a262c4e178 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/nwamadm/nwamadm.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/nwamadm/nwamadm.c @@ -1114,7 +1114,7 @@ eventhandler(nwam_event_t event) struct sockaddr_in *v4addr; struct sockaddr_in6 *v6addr; char addrstr[NWAM_MAX_VALUE_LEN]; - int plen = mask2plen(netmask); + int plen = mask2plen((struct sockaddr *)netmask); switch (address->ss_family) { case AF_INET: diff --git a/usr/src/cmd/rcm_daemon/common/ip_rcm.c b/usr/src/cmd/rcm_daemon/common/ip_rcm.c index 2ab9959372..28bca35c24 100644 --- a/usr/src/cmd/rcm_daemon/common/ip_rcm.c +++ b/usr/src/cmd/rcm_daemon/common/ip_rcm.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -1117,7 +1116,7 @@ update_pif(rcm_handle_t *hd, int af, int sock, struct ifaddrs *ifa) sizeof (pif.pi_grname)); /* Get the interface address for this interface */ - ifaddr = *(ifa->ifa_addr); + (void) memcpy(&ifaddr, ifa->ifa_addr, sizeof (ifaddr)); rsrc = get_link_resource(pif.pi_ifname); if (rsrc == NULL) { @@ -1261,7 +1260,7 @@ update_ipifs(rcm_handle_t *hd, int af) for (ptr = ainfo; ptr; ptr = IA_NEXT(ptr)) { ifa = &ptr->ia_ifa; if (ptr->ia_state != IFA_DISABLED && - af == ifa->ifa_addr->ss_family) + af == ifa->ifa_addr->sa_family) (void) update_pif(hd, af, sock, ifa); } (void) close(sock); diff --git a/usr/src/cmd/zoneadmd/vplat.c b/usr/src/cmd/zoneadmd/vplat.c index b4cc20951f..3e0307ed66 100644 --- a/usr/src/cmd/zoneadmd/vplat.c +++ b/usr/src/cmd/zoneadmd/vplat.c @@ -2552,7 +2552,7 @@ ipv4_prefixlen(struct sockaddr_in *sin) m = SIN(&mask); m->sin_family = AF_INET; if (getnetmaskbyaddr(sin->sin_addr, &m->sin_addr) == 0) { - return (mask2plen(&mask)); + return (mask2plen((struct sockaddr *)&mask)); } else if (IN_CLASSA(htonl(sin->sin_addr.s_addr))) { return (8); } else if (IN_CLASSB(ntohl(sin->sin_addr.s_addr))) { |
