summaryrefslogtreecommitdiff
path: root/usr/src/cmd
diff options
context:
space:
mode:
authorDarren Reed <Darren.Reed@Oracle.COM>2010-07-09 21:00:59 -0700
committerDarren Reed <Darren.Reed@Oracle.COM>2010-07-09 21:00:59 -0700
commit64639aaf7beb84086b88f186ea1fa9ccf0be8c57 (patch)
tree1c189cfff212c6e13f229c55a5b6c1842bb7a168 /usr/src/cmd
parentf9e0b1dc6f25356fd35837dc9e1124b2d91ed6f3 (diff)
downloadillumos-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.c12
-rw-r--r--usr/src/cmd/cmd-inet/lib/nwamd/ncu_ip.c51
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/in.ndpd/main.c5
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/vrrpd/vrrpd.c6
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c12
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/ipadm/ipadm.c2
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/nwamadm/nwamadm.c2
-rw-r--r--usr/src/cmd/rcm_daemon/common/ip_rcm.c7
-rw-r--r--usr/src/cmd/zoneadmd/vplat.c2
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))) {