Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-4]: src/usr.sbin/amd/libamu pull up rev 1.1.1.5 from trunk (req...
details: https://anonhg.NetBSD.org/src/rev/56c63cf58b27
branches: netbsd-1-4
changeset: 469453:56c63cf58b27
user: cgd <cgd%NetBSD.org@localhost>
date: Tue Sep 21 04:58:27 1999 +0000
description:
pull up rev 1.1.1.5 from trunk (requested by christos):
Upgrade amd(8) and related software to fix expoitable stack overflows
in amq(8), as reported in BUGTRAQ and elsewhere.
diffstat:
usr.sbin/amd/libamu/wire.c | 501 ++++++++++++++++++++++++++------------------
1 files changed, 294 insertions(+), 207 deletions(-)
diffs (truncated from 564 to 300 lines):
diff -r b67c3082f5b6 -r 56c63cf58b27 usr.sbin/amd/libamu/wire.c
--- a/usr.sbin/amd/libamu/wire.c Tue Sep 21 04:58:16 1999 +0000
+++ b/usr.sbin/amd/libamu/wire.c Tue Sep 21 04:58:27 1999 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wire.c,v 1.1.1.4 1999/02/01 18:45:46 christos Exp $ */
+/* $NetBSD: wire.c,v 1.1.1.4.2.1 1999/09/21 04:58:27 cgd Exp $ */
/*
* Copyright (c) 1997-1999 Erez Zadok
@@ -40,7 +40,7 @@
*
* %W% (Berkeley) %G%
*
- * Id: wire.c,v 1.2 1999/01/10 21:54:39 ezk Exp
+ * Id: wire.c,v 1.4 1999/08/22 21:12:34 ezk Exp
*
*/
@@ -63,6 +63,14 @@
#include <amu.h>
+#ifdef HAVE_IFADDRS_H
+#include <ifaddrs.h>
+#endif /* HAVE_IFADDRS_H */
+
+#ifdef HAVE_IRS_H
+# include <irs.h>
+#endif /* HAVE_IRS_H */
+
/*
* List of locally connected networks
*/
@@ -80,16 +88,9 @@
# define IFF_LOOPBACK IFF_LOCAL_LOOPBACK
#endif /* defined(IFF_LOCAL_LOOPBACK) && !defined(IFF_LOOPBACK) */
-#if defined(HAVE_FIELD_STRUCT_IFREQ_IFR_ADDR) && defined(HAVE_FIELD_STRUCT_SOCKADDR_SA_LEN)
-# define SIZE(ifr) (MAX((ifr)->ifr_addr.sa_len, sizeof((ifr)->ifr_addr)) + sizeof(ifr->ifr_name))
-#else /* not defined(HAVE_FIELD_STRUCT_IFREQ_IFR_ADDR) && defined(HAVE_FIELD_STRUCT_SOCKADDR_SA_LEN) */
-# define SIZE(ifr) sizeof(struct ifreq)
-#endif /* not defined(HAVE_FIELD_STRUCT_IFREQ_IFR_ADDR) && defined(HAVE_FIELD_STRUCT_SOCKADDR_SA_LEN) */
-
#define C(x) ((x) & 0xff)
#define GFBUFLEN 1024
-#define clist (ifc.ifc_ifcu.ifcu_req)
-#define count (ifc.ifc_len/sizeof(struct ifreq))
+#define S2IN(s) (((struct sockaddr_in *)(s))->sin_addr.s_addr)
/* return malloc'ed buffer. caller must free it */
@@ -103,7 +104,7 @@
int bufcount = 0;
int buf_size = 1024;
- buf = malloc(1024);
+ buf = SALLOC(1024);
if (!buf)
return NULL;
@@ -133,217 +134,109 @@
}
-void
-getwire(char **name1, char **number1)
+static struct addrlist *
+getwire_lookup(u_long address, u_long netmask, int ishost)
{
- struct hostent *hp;
- struct netent *np;
- struct ifconf ifc;
- struct ifreq *ifr;
- caddr_t cp, cplim;
- u_long address, netmask, subnet;
- char buf[GFBUFLEN], *s;
- int fd = -1;
- u_long net;
- u_long mask;
- u_long subnetshift;
+ struct addrlist *al;
+ u_long subnet;
char netNumberBuf[64];
- addrlist *al = NULL, *tail = NULL;
-
-#ifndef SIOCGIFFLAGS
- /* if cannot get interface flags, return nothing */
- plog(XLOG_ERROR, "getwire unable to get interface flags");
- localnets = NULL;
- return;
-#endif /* not SIOCGIFFLAGS */
-
- /*
- * Get suitable socket
- */
- if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- goto out;
-
- /*
- * Fill in ifconf details
- */
- memset(&buf[0], 0, GFBUFLEN);
- ifc.ifc_len = sizeof(buf);
- ifc.ifc_buf = buf;
-
- /*
- * Get network interface configurations
- */
- if (ioctl(fd, SIOCGIFCONF, (caddr_t) & ifc) < 0)
- goto out;
-
- /*
- * Upper bound on array
- */
- cplim = buf + ifc.ifc_len;
-
- /*
- * This is some magic to cope with both "traditional" and the
- * new 4.4BSD-style struct sockaddrs. The new structure has
- * variable length and a size field to support longer addresses.
- * AF_LINK is a new definition for 4.4BSD.
- */
+ char buf[GFBUFLEN], *s;
+#ifdef HAVE_IRS_H
+ struct nwent *np;
+#else /* not HAVE_IRS_H */
+ struct netent *np;
+#endif /* not HAVE_IRS_H */
/*
- * Scan the list looking for a suitable interface
+ * Add interface to local network singly linked list
*/
- for (cp = buf; cp < cplim; cp += SIZE(ifr)) {
- ifr = (struct ifreq *) cp;
-
- if (ifr->ifr_addr.sa_family != AF_INET)
- continue;
- else
- address = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
-
- /*
- * Get interface flags
- */
- if (ioctl(fd, SIOCGIFFLAGS, (caddr_t) ifr) < 0)
- continue;
+ al = ALLOC(struct addrlist);
+ al->ip_addr = address;
+ al->ip_mask = netmask;
+ al->ip_net_name = NO_SUBNET; /* fill in a bit later */
+ al->ip_net_num = "0.0.0.0"; /* fill in a bit later */
+ al->ip_next = NULL;
- /*
- * If the interface is a loopback, or its not running
- * then ignore it.
- */
-#ifdef IFF_LOOPBACK
- if ((ifr->ifr_flags & IFF_LOOPBACK) != 0)
- continue;
-#endif /* IFF_LOOPBACK */
- /*
- * Fix for 0.0.0.0 loopback on SunOS 3.X which defines IFF_ROUTE
- * instead of IFF_LOOPBACK.
- */
-#ifdef IFF_ROUTE
- if (ifr->ifr_flags == (IFF_UP|IFF_RUNNING))
- continue;
-#endif /* IFF_ROUTE */
+ subnet = ntohl(address) & ntohl(netmask);
- /* if the interface is not UP or not RUNNING, skip it */
- if ((ifr->ifr_flags & IFF_RUNNING) == 0 ||
- (ifr->ifr_flags & IFF_UP) == 0)
- continue;
-
- /*
- * Get the netmask of this interface
- */
- if (ioctl(fd, SIOCGIFNETMASK, (caddr_t) ifr) < 0)
- continue;
-
- netmask = ((struct sockaddr_in *) &ifr->ifr_addr)->sin_addr.s_addr;
-
- /*
- * Add interface to local network singly linked list
- */
- al = ALLOC(struct addrlist);
- al->ip_addr = address;
- al->ip_mask = netmask;
- al->ip_net_name = NO_SUBNET; /* fill in a bit later */
- al->ip_net_num = "0.0.0.0"; /* fill in a bit later */
- al->ip_next = NULL;
- /* append to the end of the list */
- if (!localnets) {
- localnets = tail = al;
- tail->ip_next = NULL;
- } else {
- tail->ip_next = al;
- tail = al;
- }
-
- /*
- * Figure out the subnet's network address
- */
- subnet = address & netmask;
-
-#ifdef IN_CLASSA
- subnet = htonl(subnet);
+ if (ishost)
+ np = NULL;
+ else {
+#ifdef HAVE_IRS_H
+ u_long mask = ntohl(netmask);
+ static struct irs_acc *irs_gen;
+ static struct irs_nw *irs_nw;
+ u_long net;
+ int maskbits;
+ u_char addr[4];
- if (IN_CLASSA(subnet)) {
- mask = IN_CLASSA_NET;
- subnetshift = 8;
- } else if (IN_CLASSB(subnet)) {
- mask = IN_CLASSB_NET;
- subnetshift = 8;
- } else {
- mask = IN_CLASSC_NET;
- subnetshift = 4;
- }
-
+ if (irs_gen == NULL)
+ irs_gen = irs_gen_acc("");
+ if (irs_gen && irs_nw == NULL)
+ irs_nw = (*irs_gen->nw_map)(irs_gen);
+ net = ntohl(address) & (mask = ntohl(netmask));
+ addr[0] = (0xFF000000 & net) >> 24;
+ addr[1] = (0x00FF0000 & net) >> 16;
+ addr[2] = (0x0000FF00 & net) >> 8;
+ addr[3] = (0x000000FF & net);
+ for (maskbits = 32; !(mask & 1); mask >>= 1)
+ maskbits--;
+ np = (*irs_nw->byaddr)(irs_nw, addr, maskbits, AF_INET);
+#else /* not HAVE_IRS_H */
+ np = getnetbyaddr(subnet, AF_INET);
/*
- * If there are more bits than the standard mask
- * would suggest, subnets must be in use.
- * Guess at the subnet mask, assuming reasonable
- * width subnet fields.
- * XXX: Or-in at least 1 byte's worth of 1s to make
- * sure the top bits remain set.
- */
- while (subnet & ~mask)
- mask = (mask >> subnetshift) | 0xff000000;
-
- net = subnet & mask;
- while ((mask & 1) == 0)
- mask >>= 1, net >>= 1;
-
- /*
- * Now get a usable name.
- * First use the network database,
- * then the host database,
- * and finally just make a dotted quad.
+ * Some systems (IRIX 6.4) cannot getnetbyaddr on networks such as
+ * "128.59.16.0". Instead, they need to look for the short form of
+ * the network, "128.59.16". So if the first getnetbyaddr failed, we
+ * shift the subnet way from zeros and try again.
*/
- np = getnetbyaddr(net, AF_INET);
-
- /* the network address has been masked off */
- if ((subnet & 0xffffff) == 0) {
- sprintf(netNumberBuf, "%lu", C(subnet >> 24));
- } else if ((subnet & 0xffff) == 0) {
- sprintf(netNumberBuf, "%lu.%lu",
- C(subnet >> 24), C(subnet >> 16));
- } else if ((subnet & 0xff) == 0) {
- sprintf(netNumberBuf, "%lu.%lu.%lu",
- C(subnet >> 24), C(subnet >> 16),
- C(subnet >> 8));
- } else {
- sprintf(netNumberBuf, "%lu.%lu.%lu.%lu",
- C(subnet >> 24), C(subnet >> 16),
- C(subnet >> 8), C(subnet));
+ if (!np) {
+ u_long short_subnet = subnet;
+ while(short_subnet && (short_subnet & 0x000000ff) == 0)
+ short_subnet >>= 8;
+ np = getnetbyaddr(short_subnet, AF_INET);
+ if (np)
+ plog(XLOG_WARNING, "getnetbyaddr failed on 0x%x, suceeded on 0x%x",
+ (u_int) subnet, (u_int) short_subnet);
}
-
- /* fill in network number (string) */
- al->ip_net_num = strdup(netNumberBuf);
-
-#else /* not IN_CLASSA */
Home |
Main Index |
Thread Index |
Old Index