summaryrefslogtreecommitdiffstats
path: root/lib/libc/net/getifaddrs.c
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2001-10-02 13:51:29 +0000
committerume <ume@FreeBSD.org>2001-10-02 13:51:29 +0000
commitb348544a5d909bc8e3d79071162e855c0093eb0c (patch)
tree70aa8af9ef9097604ae1e74a4041b8bba5e754fe /lib/libc/net/getifaddrs.c
parente40169e5519171793154a6e1eabbc31bd4ff13a5 (diff)
downloadFreeBSD-src-b348544a5d909bc8e3d79071162e855c0093eb0c.zip
FreeBSD-src-b348544a5d909bc8e3d79071162e855c0093eb0c.tar.gz
- cope with sa_len < sizeof(struct sockaddr).
From: Patrik Lindergren <patrik@datacom.nu> - delint (pointer cast issue). from netbsd-current Obtained from: KAME MFC after: 1 week
Diffstat (limited to 'lib/libc/net/getifaddrs.c')
-rw-r--r--lib/libc/net/getifaddrs.c79
1 files changed, 44 insertions, 35 deletions
diff --git a/lib/libc/net/getifaddrs.c b/lib/libc/net/getifaddrs.c
index 6b81196..c56f79b 100644
--- a/lib/libc/net/getifaddrs.c
+++ b/lib/libc/net/getifaddrs.c
@@ -1,4 +1,5 @@
/* $FreeBSD$ */
+/* $KAME: getifaddrs.c,v 1.9 2001/08/20 02:31:20 itojun Exp $ */
/*
* Copyright (c) 1995, 1999
@@ -99,7 +100,7 @@ getifaddrs(struct ifaddrs **pif)
struct sockaddr_dl *dl;
struct sockaddr *sa;
struct ifaddrs *ifa, *ift;
- u_short index = 0;
+ u_short idx = 0;
#else /* NET_RT_IFLIST */
char buf[1024];
int m, sock;
@@ -129,35 +130,35 @@ getifaddrs(struct ifaddrs **pif)
}
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
- rtm = (struct rt_msghdr *)next;
+ rtm = (struct rt_msghdr *)(void *)next;
if (rtm->rtm_version != RTM_VERSION)
continue;
switch (rtm->rtm_type) {
case RTM_IFINFO:
- ifm = (struct if_msghdr *)rtm;
+ ifm = (struct if_msghdr *)(void *)rtm;
if (ifm->ifm_addrs & RTA_IFP) {
- index = ifm->ifm_index;
+ idx = ifm->ifm_index;
++icnt;
- dl = (struct sockaddr_dl *)(ifm + 1);
- dcnt += SA_RLEN((struct sockaddr *)dl) +
- ALIGNBYTES;
+ dl = (struct sockaddr_dl *)(void *)(ifm + 1);
+ dcnt += SA_RLEN((struct sockaddr *)(void*)dl) +
+ ALIGNBYTES;
#ifdef HAVE_IFM_DATA
dcnt += sizeof(ifm->ifm_data);
#endif /* HAVE_IFM_DATA */
ncnt += dl->sdl_nlen + 1;
} else
- index = 0;
+ idx = 0;
break;
case RTM_NEWADDR:
- ifam = (struct ifa_msghdr *)rtm;
- if (index && ifam->ifam_index != index)
+ ifam = (struct ifa_msghdr *)(void *)rtm;
+ if (idx && ifam->ifam_index != idx)
abort(); /* this cannot happen */
#define RTA_MASKS (RTA_NETMASK | RTA_IFA | RTA_BRD)
- if (index == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0)
+ if (idx == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0)
break;
- p = (char *)(ifam + 1);
+ p = (char *)(void *)(ifam + 1);
++icnt;
#ifdef HAVE_IFAM_DATA
dcnt += sizeof(ifam->ifam_data) + ALIGNBYTES;
@@ -168,7 +169,7 @@ getifaddrs(struct ifaddrs **pif)
if ((RTA_MASKS & ifam->ifam_addrs & (1 << i))
== 0)
continue;
- sa = (struct sockaddr *)p;
+ sa = (struct sockaddr *)(void *)p;
len = SA_RLEN(sa);
if (i == RTAX_IFA) {
alen = len;
@@ -180,7 +181,7 @@ getifaddrs(struct ifaddrs **pif)
if ((RTA_MASKS & ifam->ifam_addrs & (1 << i))
== 0)
continue;
- sa = (struct sockaddr *)p;
+ sa = (struct sockaddr *)(void *)p;
len = SA_RLEN(sa);
if (i == RTAX_NETMASK && SA_LEN(sa) == 0)
dcnt += alen;
@@ -213,7 +214,10 @@ getifaddrs(struct ifaddrs **pif)
dcnt += SA_RLEN(sa);
ncnt += sizeof(ifr->ifr_name) + 1;
- ifr = (struct ifreq *)(((char *)sa) + SA_LEN(sa));
+ if (SA_LEN(sa) < sizeof(*sa))
+ ifr = (struct ifreq *)(((char *)sa) + sizeof(*sa));
+ else
+ ifr = (struct ifreq *)(((char *)sa) + SA_LEN(sa));
}
#endif /* NET_RT_IFLIST */
@@ -228,7 +232,7 @@ getifaddrs(struct ifaddrs **pif)
return(-1);
}
- ifa = (struct ifaddrs *)data;
+ ifa = (struct ifaddrs *)(void *)data;
data += sizeof(struct ifaddrs) * icnt;
names = data + dcnt;
@@ -236,28 +240,31 @@ getifaddrs(struct ifaddrs **pif)
ift = ifa;
#ifdef NET_RT_IFLIST
- index = 0;
+ idx = 0;
for (next = buf; next < buf + needed; next += rtm->rtm_msglen) {
- rtm = (struct rt_msghdr *)next;
+ rtm = (struct rt_msghdr *)(void *)next;
if (rtm->rtm_version != RTM_VERSION)
continue;
switch (rtm->rtm_type) {
case RTM_IFINFO:
- ifm = (struct if_msghdr *)rtm;
+ ifm = (struct if_msghdr *)(void *)rtm;
if (ifm->ifm_addrs & RTA_IFP) {
- index = ifm->ifm_index;
- dl = (struct sockaddr_dl *)(ifm + 1);
+ idx = ifm->ifm_index;
+ dl = (struct sockaddr_dl *)(void *)(ifm + 1);
cif = ift;
ift->ifa_name = names;
ift->ifa_flags = (int)ifm->ifm_flags;
- memcpy(names, dl->sdl_data, dl->sdl_nlen);
+ memcpy(names, dl->sdl_data,
+ (size_t)dl->sdl_nlen);
names[dl->sdl_nlen] = 0;
names += dl->sdl_nlen + 1;
- ift->ifa_addr = (struct sockaddr *)data;
- memcpy(data, dl, SA_LEN((struct sockaddr *)dl));
- data += SA_RLEN((struct sockaddr *)dl);
+ ift->ifa_addr = (struct sockaddr *)(void *)data;
+ memcpy(data, dl,
+ (size_t)SA_LEN((struct sockaddr *)
+ (void *)dl));
+ data += SA_RLEN((struct sockaddr *)(void *)dl);
#ifdef HAVE_IFM_DATA
/* ifm_data needs to be aligned */
@@ -270,27 +277,27 @@ getifaddrs(struct ifaddrs **pif)
ift = (ift->ifa_next = ift + 1);
} else
- index = 0;
+ idx = 0;
break;
case RTM_NEWADDR:
- ifam = (struct ifa_msghdr *)rtm;
- if (index && ifam->ifam_index != index)
+ ifam = (struct ifa_msghdr *)(void *)rtm;
+ if (idx && ifam->ifam_index != idx)
abort(); /* this cannot happen */
- if (index == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0)
+ if (idx == 0 || (ifam->ifam_addrs & RTA_MASKS) == 0)
break;
ift->ifa_name = cif->ifa_name;
ift->ifa_flags = cif->ifa_flags;
ift->ifa_data = NULL;
- p = (char *)(ifam + 1);
+ p = (char *)(void *)(ifam + 1);
/* Scan to look for length of address */
alen = 0;
for (p0 = p, i = 0; i < RTAX_MAX; i++) {
if ((RTA_MASKS & ifam->ifam_addrs & (1 << i))
== 0)
continue;
- sa = (struct sockaddr *)p;
+ sa = (struct sockaddr *)(void *)p;
len = SA_RLEN(sa);
if (i == RTAX_IFA) {
alen = len;
@@ -302,18 +309,19 @@ getifaddrs(struct ifaddrs **pif)
if ((RTA_MASKS & ifam->ifam_addrs & (1 << i))
== 0)
continue;
- sa = (struct sockaddr *)p;
+ sa = (struct sockaddr *)(void *)p;
len = SA_RLEN(sa);
switch (i) {
case RTAX_IFA:
- ift->ifa_addr = (struct sockaddr *)data;
+ ift->ifa_addr =
+ (struct sockaddr *)(void *)data;
memcpy(data, p, len);
data += len;
break;
case RTAX_NETMASK:
ift->ifa_netmask =
- (struct sockaddr *)data;
+ (struct sockaddr *)(void *)data;
if (SA_LEN(sa) == 0) {
memset(data, 0, alen);
data += alen;
@@ -325,7 +333,7 @@ getifaddrs(struct ifaddrs **pif)
case RTAX_BRD:
ift->ifa_broadaddr =
- (struct sockaddr *)data;
+ (struct sockaddr *)(void *)data;
memcpy(data, p, len);
data += len;
break;
@@ -381,5 +389,6 @@ getifaddrs(struct ifaddrs **pif)
void
freeifaddrs(struct ifaddrs *ifp)
{
+
free(ifp);
}
OpenPOWER on IntegriCloud