Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/traceroute Don't use a static buffer for ifaddrs (a...
details: https://anonhg.NetBSD.org/src/rev/adc59ef3b89c
branches: trunk
changeset: 764895:adc59ef3b89c
user: christos <christos%NetBSD.org@localhost>
date: Wed May 11 00:38:28 2011 +0000
description:
Don't use a static buffer for ifaddrs (and not check for overflowing it!)
(speciallly if you are setuid!)
diffstat:
usr.sbin/traceroute/ifaddrlist.c | 61 ++++++++++++++++++++++++---------------
usr.sbin/traceroute/ifaddrlist.h | 6 +-
2 files changed, 40 insertions(+), 27 deletions(-)
diffs (116 lines):
diff -r 554b577d8589 -r adc59ef3b89c usr.sbin/traceroute/ifaddrlist.c
--- a/usr.sbin/traceroute/ifaddrlist.c Wed May 11 00:38:03 2011 +0000
+++ b/usr.sbin/traceroute/ifaddrlist.c Wed May 11 00:38:28 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ifaddrlist.c,v 1.8 2011/05/10 01:52:49 christos Exp $ */
+/* $NetBSD: ifaddrlist.c,v 1.9 2011/05/11 00:38:28 christos Exp $ */
/*
* Copyright (c) 1997
@@ -39,7 +39,7 @@
static const char rcsid[] =
"@(#) Header: ifaddrlist.c,v 1.2 97/04/22 13:31:05 leres Exp (LBL)";
#else
-__RCSID("$NetBSD: ifaddrlist.c,v 1.8 2011/05/10 01:52:49 christos Exp $");
+__RCSID("$NetBSD: ifaddrlist.c,v 1.9 2011/05/11 00:38:28 christos Exp $");
#endif
#endif
@@ -82,29 +82,23 @@
#define ISLOOPBACK(p) (strcmp((p)->ifa_name, "lo0") == 0)
#endif
-#define MAX_IPADDR 256
-
/*
* Return the interface list
*/
-int
-ifaddrlist(struct ifaddrlist **ipaddrp, char *errbuf, int buflen)
+ssize_t
+ifaddrlist(struct ifaddrlist **ipaddrp, char *errbuf, size_t buflen)
{
- int nipaddr;
struct sockaddr_in *sin;
- struct ifaddrs *ifap, *ifa;
- struct ifaddrlist *al;
- static struct ifaddrlist xifaddrlist[MAX_IPADDR];
+ struct ifaddrs *ifap = NULL, *ifa;
+ struct ifaddrlist *al = NULL, *nal;
+ size_t i = 0, maxal = 10;
- al = xifaddrlist;
- nipaddr = 0;
+ if (getifaddrs(&ifap) != 0)
+ goto out;
- if (getifaddrs(&ifap) != 0) {
- (void)snprintf(errbuf, buflen, "getifaddrs: %s",
- strerror(errno));
- return (-1);
- }
-
+ if ((al = malloc(maxal * sizeof(*al))) == NULL)
+ goto out;
+
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
if (ifa->ifa_addr->sa_family != AF_INET)
continue;
@@ -121,12 +115,31 @@
if (ntohl(sin->sin_addr.s_addr) == INADDR_LOOPBACK)
continue;
- al->addr = sin->sin_addr.s_addr;
- al->device = strdup(ifa->ifa_name);
- ++al;
- ++nipaddr;
+ if (i == maxal) {
+ maxal <<= 1;
+ if ((nal = realloc(al, maxal * sizeof(*al))) == NULL)
+ goto out;
+ al = nal;
+ }
+
+ al[i].addr = sin->sin_addr.s_addr;
+ if ((al[i].device = strdup(ifa->ifa_name)) == NULL)
+ goto out;
+ i++;
}
- *ipaddrp = xifaddrlist;
+ if ((nal = realloc(al, i * sizeof(*al))) == NULL)
+ goto out;
freeifaddrs(ifap);
- return (nipaddr);
+ *ipaddrp = nal;
+ return (ssize_t)i;
+out:
+ if (ifap)
+ freeifaddrs(ifap);
+ if (al) {
+ while (i > 0)
+ free(al[--i].device);
+ free(al);
+ }
+ (void)snprintf(errbuf, buflen, "%s: %s", __func__, strerror(errno));
+ return -1;
}
diff -r 554b577d8589 -r adc59ef3b89c usr.sbin/traceroute/ifaddrlist.h
--- a/usr.sbin/traceroute/ifaddrlist.h Wed May 11 00:38:03 2011 +0000
+++ b/usr.sbin/traceroute/ifaddrlist.h Wed May 11 00:38:28 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ifaddrlist.h,v 1.2 1998/07/04 20:47:24 mrg Exp $ */
+/* $NetBSD: ifaddrlist.h,v 1.3 2011/05/11 00:38:28 christos Exp $ */
/*
* Copyright (c) 1997
@@ -24,8 +24,8 @@
*/
struct ifaddrlist {
- u_int32_t addr;
+ uint32_t addr;
char *device;
};
-int ifaddrlist(struct ifaddrlist **, char *, int);
+ssize_t ifaddrlist(struct ifaddrlist **, char *, size_t);
Home |
Main Index |
Thread Index |
Old Index