[PATCH]sbin/route WARNS=6 cleanup, Style(9), small bug fix

Sepherosa Ziehau sepherosa at softhome.net
Fri Mar 4 20:19:04 PST 2005


small bug fixed:
at the end of route.c:netname():
. ..
u_short *s = (u_short *)sa->sa_data;
u_short *slim = s + ((sa->sa_len + 1)>>1);
. ..
while (s < slim && cp < cpe)
	cp += snprintf(cp, cpe - cp, " %x", *s++);
. ..
this will cause `s' point to the mem-location which does not belong to  
`sa'.

patch:

Index: Makefile
===================================================================
RCS file: /opt/df_cvs/src/sbin/route/Makefile,v
retrieving revision 1.4
diff -u -r1.4 Makefile
--- Makefile	24 Mar 2004 07:04:28 -0000	1.4
+++ Makefile	5 Mar 2005 04:12:05 -0000
@@ -2,15 +2,17 @@
 # $FreeBSD: src/sbin/route/Makefile,v 1.11.2.3 2002/12/04 14:05:42 ru Exp  
$
 # $DragonFly: src/sbin/route/Makefile,v 1.4 2004/03/24 07:04:28 dillon  
Exp $

+WARNS?=6
+WARNS_WERROR=yes
 PROG=	route
 MAN=	route.8
 SRCS=	route.c show.c keywords.h keywords.c
-CFLAGS+=-I. -Wall -DNS
+CFLAGS+=-I. -DNS
 CFLAGS+=-DINET6
 CLEANFILES+=keywords.h keywords.c _keywords.tmp
 keywords.h:
-	echo -e "extern struct keytab {\n\tchar\t*kt_cp;\n\tint\t kt_i;\n}  
keywords[];\n\n" > ${.TARGET}
+	echo -e "extern struct keytab {\n\tconst char\t*kt_cp;\n\tint\t\t  
kt_i;\n} keywords[];\n\n" > ${.TARGET}
 	sed -e '/^#/d' -e '/^$$/d' ${.CURDIR}/keywords > _keywords.tmp
 	tr a-z A-Z < _keywords.tmp | paste _keywords.tmp - | \
 	    awk '{ \
Index: extern.h
===================================================================
RCS file: /opt/df_cvs/src/sbin/route/extern.h,v
retrieving revision 1.2
diff -u -r1.2 extern.h
--- extern.h	23 Mar 2004 18:25:51 -0000	1.2
+++ extern.h	5 Mar 2005 04:12:05 -0000
@@ -33,14 +33,18 @@
  */

 struct sockaddr;
-struct sockaddr_x25;
 struct sockaddr_ns;
 /* show.c */
-void show(int, char **);
+void	 show(int, char **);
 /* route.c */
-extern int nflag, wflag;
-char *routename(struct sockaddr *);
-char *netname(struct sockaddr *);
-char *ns_print(struct sockaddr_ns *);
+extern int	nflag, wflag;
+
+char	*routename(struct sockaddr *);
+char	*netname(struct sockaddr *);
+int	 keyword(char *);
+void	 usage(const char *) __dead2;
+#ifdef NS
+char	*ns_print(struct sockaddr_ns *);
+#endif
Index: route.c
===================================================================
RCS file: /opt/df_cvs/src/sbin/route/route.c,v
retrieving revision 1.8
diff -u -r1.8 route.c
--- route.c	2 Nov 2004 23:49:38 -0000	1.8
+++ route.c	5 Mar 2005 04:12:05 -0000
@@ -69,7 +69,6 @@
 #include "extern.h"
 #include "keywords.h"
-struct	ortentry route;
 union	sockunion {
 	struct	sockaddr sa;
 	struct	sockaddr_in sin;
@@ -85,42 +84,45 @@
 	struct	sockaddr_storage ss; /* added to avoid memory overrun */
 } so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp;
-typedef union sockunion *sup;
+typedef union sockunion *	sup;
-int	pid, rtm_addrs;
-int	s;
-int	forcehost, forcenet, doflush, nflag, af, qflag, tflag, keyword();
-int	iflag, verbose, aflen = sizeof(struct sockaddr_in);
-int	wflag;
-int	locking, lockrest, debugonly;
-struct	rt_metrics rt_metrics;
-u_long  rtm_inits;
-uid_t	uid;
-
-int	 atalk_aton(const char *, struct at_addr *);
-char	*atalk_ntoa(struct at_addr);
-char	*netname(struct sockaddr *);
-void	 flushroutes(int, char **);
-void	 newroute(int, char **);
-void	 monitor(void);
-void	 sockaddr(char *, struct sockaddr *);
-void	 sodump(sup, char *);
-void	 bprintf(FILE *, int, u_char *);
-void	 print_getmsg(struct rt_msghdr *, int);
-void	 print_rtmsg(struct rt_msghdr *, int);
-void	 pmsg_common(struct rt_msghdr *);
-void	 pmsg_addrs(char *, int);
-void	 mask_addr(void);
-#ifdef INET6
-static int inet6_makenetandmask(struct sockaddr_in6 *, char *);
+int	nflag, wflag;
+
+static struct ortentry route;
+static struct rt_metrics rt_metrics;
+static int	pid, rtm_addrs;
+static int	s;
+static int	forcehost, forcenet, af, qflag, tflag;
+static int	iflag, verbose, aflen = sizeof(struct sockaddr_in);
+static int	locking, lockrest, debugonly;
+static u_long	rtm_inits;
+static uid_t	uid;
+#ifdef NS
+static short	ns_bh[] = {-1,-1,-1};
 #endif
-int	 getaddr(int, char *, struct hostent **);
-int	 rtmsg(int, int);
-int	 x25_makemask();
-int	 prefixlen(char *);
-extern	char *iso_ntoa();
-void usage(const char *) __dead2;
+static int	 atalk_aton(const char *, struct at_addr *);
+static char	*atalk_ntoa(struct at_addr);
+static void	 flushroutes(int, char **);
+static void	 set_metric(char *, int);
+static void	 newroute(int, char **);
+static void	 inet_makenetandmask(u_long, struct sockaddr_in *, u_long);
+static void	 interfaces(void);
+static void	 monitor(void);
+static void	 sockaddr(char *, struct sockaddr *);
+static void	 sodump(sup, const char *);
+static void	 bprintf(FILE *, int, u_char *);
+static void	 print_getmsg(struct rt_msghdr *, int);
+static void	 print_rtmsg(struct rt_msghdr *, int);
+static void	 pmsg_common(struct rt_msghdr *);
+static void	 pmsg_addrs(char *, int);
+static void	 mask_addr(void);
+static int	 getaddr(int, char *, struct hostent **);
+static int	 rtmsg(int, int);
+static int	 prefixlen(const char *);
+#ifdef INET6
+static int	 inet6_makenetandmask(struct sockaddr_in6 *, const char *);
+#endif
 void
 usage(const char *cp)
@@ -212,7 +214,7 @@
  * Purge all entries in the routing tables not
  * associated with network interfaces.
  */
-void
+static void
 flushroutes(int argc, char **argv)
 {
 	size_t needed;
@@ -319,14 +321,11 @@
 char *
 routename(struct sockaddr *sa)
 {
-	char *cp;
+	const char *cp;
 	static char line[MAXHOSTNAMELEN + 1];
 	struct hostent *hp;
 	static char domain[MAXHOSTNAMELEN + 1];
 	static int first = 1;
-#ifdef NS
-	char *ns_print();
-#endif
 	if (first) {
 		first = 0;
@@ -353,9 +352,10 @@
 			hp = gethostbyaddr((char *)&in, sizeof(struct in_addr),
 				AF_INET);
 			if (hp) {
-				if ((cp = strchr(hp->h_name, '.')) && !wflag &&
-				    !strcmp(cp + 1, domain))
-					*cp = 0;
+				char *cptr;
+				if ((cptr = strchr(hp->h_name, '.')) &&
+				    !wflag && !strcmp(cptr + 1, domain))
+					*cptr = 0;
 				cp = hp->h_name;
 			}
 		}
@@ -415,13 +415,13 @@
 		return(link_ntoa((struct sockaddr_dl *)sa));
 	default:
-	    {	u_short *s = (u_short *)sa;
-		u_short *slim = s + ((sa->sa_len + 1) >> 1);
-		char *cp = line + sprintf(line, "(%d)", sa->sa_family);
+	    {	u_short *sp = (u_short *)sa;
+		u_short *splim = sp + ((sa->sa_len + 1) >> 1);
+		char *cps = line + sprintf(line, "(%d)", sa->sa_family);
 		char *cpe = line + sizeof(line);
-		while (++s < slim && cp < cpe) /* start with sa->sa_data */
-			cp += snprintf(cp, cpe - cp, " %x", *s);
+		while (++sp < splim && cps < cpe) /* start with sa->sa_data */
+			cps += snprintf(cps, cpe - cps, " %x", *sp);
 		break;
 	    }
 	}
@@ -435,15 +435,12 @@
 char *
 netname(struct sockaddr *sa)
 {
-	char *cp = 0;
+	const char *cp = 0;
 	static char line[MAXHOSTNAMELEN + 1];
 	struct netent *np = 0;
 	u_long net, mask;
 	u_long i;
 	int subnetshift;
-#ifdef NS
-	char *ns_print();
-#endif
 	switch (sa->sa_family) {

@@ -549,20 +546,20 @@

 	default:
-	    {	u_short *s = (u_short *)sa->sa_data;
-		u_short *slim = s + ((sa->sa_len + 1)>>1);
-		char *cp = line + sprintf(line, "af %d:", sa->sa_family);
+	    {	u_short *sp = (u_short *)sa;
+		u_short *splim = sp + ((sa->sa_len + 1)>>1);
+		char *cps = line + sprintf(line, "af %d:", sa->sa_family);
 		char *cpe = line + sizeof(line);
-		while (s < slim && cp < cpe)
-			cp += snprintf(cp, cpe - cp, " %x", *s++);
+		while (++sp < splim && cps < cpe) /* start with sa->sa_data */
+			cps += snprintf(cps, cpe - cps, " %x", *sp);
 		break;
 	    }
 	}
 	return(line);
 }
-void
+static void
 set_metric(char *value, int key)
 {
 	int flag = 0;
@@ -587,10 +584,11 @@
 	*valp = atoi(value);
 }
-void
+static void
 newroute(int argc, char **argv)
 {
-	char *cmd, *dest = "", *gateway = "", *err;
+	char *cmd;
+	const char *err_str, *dest = "", *gateway = "";
 	int ishost = 0, proxy = 0, ret, attempts, oerrno, flags = RTF_STATIC;
 	int key;
 	struct hostent *hp = 0;
@@ -776,8 +774,10 @@
 			break;
 		if (af == AF_INET && *gateway && hp && hp->h_addr_list[1]) {
 			hp->h_addr_list++;
-			memmove(&so_gate.sin.sin_addr, hp->h_addr_list[0],
-			    MIN(hp->h_length, sizeof(so_gate.sin.sin_addr)));
+			memmove(&so_gate.sin.sin_addr,
+				hp->h_addr_list[0],
+				MIN((size_t)hp->h_length,
+				    sizeof(so_gate.sin.sin_addr)));
 		} else
 			break;
 	}
@@ -797,30 +797,30 @@
 		} else {
 			switch (oerrno) {
 			case ESRCH:
-				err = "not in table";
+				err_str = "not in table";
 				break;
 			case EBUSY:
-				err = "entry in use";
+				err_str = "entry in use";
 				break;
 			case ENOBUFS:
-				err = "routing table overflow";
+				err_str = "routing table overflow";
 				break;
 			case EDQUOT: /* handle recursion avoidance in
 					rt_setgate() */
-				err = "gateway uses the same route";
+				err_str = "gateway uses the same route";
 				break;
 			default:
-				err = strerror(oerrno);
+				err_str = strerror(oerrno);
 				break;
 			}
-			printf(": %s\n", err);
+			printf(": %s\n", err_str);
 		}
 	}
 	exit(ret != 0);
 }
-void
-inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
+static void
+inet_makenetandmask(u_long net, struct sockaddr_in *in, u_long bits)
 {
 	u_long addr, mask = 0;
 	char *cp;
@@ -850,15 +850,15 @@
 	}
 	if (bits)
 		mask = 0xffffffff << (32 - bits);
-	sin->sin_addr.s_addr = htonl(addr);
-	sin = &so_mask.sin;
-	sin->sin_addr.s_addr = htonl(mask);
-	sin->sin_len = 0;
-	sin->sin_family = 0;
-	cp = (char *)(&sin->sin_addr + 1);
-	while (*--cp == 0 && cp > (char *)sin)
+	in->sin_addr.s_addr = htonl(addr);
+	in = &so_mask.sin;
+	in->sin_addr.s_addr = htonl(mask);
+	in->sin_len = 0;
+	in->sin_family = 0;
+	cp = (char *)(&in->sin_addr + 1);
+	while (*--cp == 0 && cp > (char *)in)
 		;
-	sin->sin_len = 1 + cp - (char *)sin;
+	in->sin_len = 1 + cp - (char *)in;
 }
 #ifdef INET6
@@ -866,7 +866,7 @@
  * XXX the function may need more improvement...
  */
 static int
-inet6_makenetandmask(struct sockaddr_in6 *sin6, char *plen)
+inet6_makenetandmask(struct sockaddr_in6 *sin6, const char *plen)
 {
 	struct in6_addr in6;
@@ -895,8 +895,8 @@
  * Interpret an argument as a network address of some kind,
  * returning 1 if a host address, 0 if a network address.
  */
-int
-getaddr(int which, char *s, struct hostent **hpp)
+static int
+getaddr(int which, char *str, struct hostent **hpp)
 {
 	sup su;
 	struct hostent *hp;
@@ -928,7 +928,7 @@
 				if (ifa->ifa_addr->sa_family != AF_LINK)
 					continue;
-				if (strcmp(s, ifa->ifa_name))
+				if (strcmp(str, ifa->ifa_name))
 					continue;
 				sdl = (struct sockaddr_dl *)ifa->ifa_addr;
@@ -975,7 +975,7 @@
 	su->sa.sa_len = aflen;
 	su->sa.sa_family = afamily; /* cases that don't want it have left
 				       already */
-	if (strcmp(s, "default") == 0) {
+	if (strcmp(str, "default") == 0) {
 		/*
 		 * Default is net 0.0.0.0/0
 		 */
@@ -983,7 +983,7 @@
 		case RTA_DST:
 			forcenet++;
 			/* bzero(su, sizeof(*su)); *//* for readability */
-			getaddr(RTA_NETMASK, s, 0);
+			getaddr(RTA_NETMASK, str, 0);
 			break;
 		case RTA_NETMASK:
 		case RTA_GENMASK:
@@ -999,16 +999,16 @@
 		struct addrinfo hints, *res;
 		q = NULL;
-		if (which == RTA_DST && (q = strchr(s, '/')) != NULL)
+		if (which == RTA_DST && (q = strchr(str, '/')) != NULL)
 			*q = '\0';
 		memset(&hints, 0, sizeof(hints));
 		hints.ai_family = afamily;	/*AF_INET6*/
 		hints.ai_flags = AI_NUMERICHOST;
 		hints.ai_socktype = SOCK_DGRAM;		/*dummy*/
-		if (getaddrinfo(s, "0", &hints, &res) != 0 ||
+		if (getaddrinfo(str, "0", &hints, &res) != 0 ||
 		    res->ai_family != AF_INET6 ||
 		    res->ai_addrlen != sizeof(su->sin6)) {
-			fprintf(stderr, "%s: bad value\n", s);
+			fprintf(stderr, "%s: bad value\n", str);
 			exit(1);
 		}
 		memcpy(&su->sin6, res->ai_addr, sizeof(su->sin6));
@@ -1033,7 +1033,6 @@
 #ifdef NS
 	case AF_NS:
 		if (which == RTA_DST) {
-			extern short ns_bh[3];
 			struct sockaddr_ns *sms = &(so_mask.sns);
 			memset(sms, 0, sizeof(*sms));
 			sms->sns_family = 0;
@@ -1041,25 +1040,25 @@
 			sms->sns_addr.x_net = *(union ns_net *)ns_bh;
 			rtm_addrs |= RTA_NETMASK;
 		}
-		su->sns.sns_addr = ns_addr(s);
+		su->sns.sns_addr = ns_addr(str);
 		return(!ns_nullhost(su->sns.sns_addr));
 #endif
 	case AF_APPLETALK:
-		if (!atalk_aton(s, &su->sat.sat_addr))
-			errx(EX_NOHOST, "bad address: %s", s);
+		if (!atalk_aton(str, &su->sat.sat_addr))
+			errx(EX_NOHOST, "bad address: %s", str);
 		rtm_addrs |= RTA_NETMASK;
 		return(forcehost || su->sat.sat_addr.s_node != 0);
 	case AF_LINK:
-		link_addr(s, &su->sdl);
+		link_addr(str, &su->sdl);
 		return(1);
 	case PF_ROUTE:
 		su->sa.sa_len = sizeof(*su);
-		sockaddr(s, &su->sa);
+		sockaddr(str, &su->sa);
 		return(1);
 	case AF_INET:
@@ -1071,10 +1070,10 @@
 		hpp = &hp;
 	*hpp = NULL;
-	q = strchr(s,'/');
+	q = strchr(str,'/');
 	if (q && which == RTA_DST) {
 		*q = '\0';
-		if ((val = inet_network(s)) != INADDR_NONE) {
+		if ((val = inet_network(str)) != INADDR_NONE) {
 			inet_makenetandmask(
 				val, &su->sin, strtoul(q+1, 0, 0));
 			return(0);
@@ -1082,7 +1081,7 @@
 		*q = '/';
 	}
 	if ((which != RTA_DST || forcenet == 0) &&
-	    inet_aton(s, &su->sin.sin_addr)) {
+	    inet_aton(str, &su->sin.sin_addr)) {
 		val = su->sin.sin_addr.s_addr;
 		if (which != RTA_DST ||
 		    inet_lnaof(su->sin.sin_addr) != INADDR_ANY)
@@ -1093,27 +1092,27 @@
 		}
 	}
 	if (which == RTA_DST && forcehost == 0 &&
-	    ((val = inet_network(s)) != INADDR_NONE ||
-	    ((np = getnetbyname(s)) != NULL && (val = np->n_net) != 0))) {
+	    ((val = inet_network(str)) != INADDR_NONE ||
+	    ((np = getnetbyname(str)) != NULL && (val = np->n_net) != 0))) {
 netdone:
 		inet_makenetandmask(val, &su->sin, 0);
 		return(0);
 	}
-	hp = gethostbyname(s);
+	hp = gethostbyname(str);
 	if (hp) {
 		*hpp = hp;
 		su->sin.sin_family = hp->h_addrtype;
 		memmove((char *)&su->sin.sin_addr, hp->h_addr,
-		    MIN(hp->h_length, sizeof(su->sin.sin_addr)));
+		    MIN((size_t)hp->h_length, sizeof(su->sin.sin_addr)));
 		return(1);
 	}
-	errx(EX_NOHOST, "bad address: %s", s);
+	errx(EX_NOHOST, "bad address: %s", str);
 }
-int
-prefixlen(char *s)
+static int
+prefixlen(const char *len_str)
 {
-	int len = atoi(s), q, r;
+	int len = atoi(len_str), q, r;
 	int max;
 	char *p;
@@ -1136,7 +1135,7 @@
 	}
 	if (len < 0 || max < len) {
-		fprintf(stderr, "%s: bad value\n", s);
+		fprintf(stderr, "%s: bad value\n", len_str);
 		exit(1);
 	}
 	
@@ -1157,7 +1156,6 @@
 #ifdef NS
 short ns_nullh[] = {0,0,0};
-short ns_bh[] = {-1,-1,-1};
 char *
 ns_print(struct sockaddr_ns *sns)
@@ -1166,7 +1164,7 @@
 	union { union ns_net net_e; u_long long_e; } net;
 	u_short port;
 	static char mybuf[50+MAXHOSTNAMELEN], cport[10], chost[25];
-	char *host = "";
+	const char *host = "";
 	char *p;
 	u_char *q;
@@ -1176,8 +1174,9 @@
 	net.net_e  = work.x_net;
 	if (ns_nullhost(work) && net.long_e == 0) {
 		if (!port)
-			return("*.*");
-		sprintf(mybuf, "*.%XH", port);
+			strncpy(mybuf, "*.*", sizeof(mybuf));
+		else
+			sprintf(mybuf, "*.%XH", port);
 		return(mybuf);
 	}
@@ -1205,7 +1204,7 @@
 }
 #endif
-void
+static void
 interfaces(void)
 {
 	size_t needed;
@@ -1232,7 +1231,7 @@
 	}
 }
-void
+static void
 monitor(void)
 {
 	int n;
@@ -1257,7 +1256,7 @@
 	char	m_space[512];
 } m_rtmsg;
-int
+static int
 rtmsg(int cmd, int flags)
 {
 	static int seq;
@@ -1325,7 +1324,7 @@
 	return(0);
 }
-void
+static void
 mask_addr(void)
 {
 	int olen = so_mask.sa.sa_len;
@@ -1359,7 +1358,7 @@
 		*--cp1 &= *--cp2;
 }
-char *msgtypes[] = {
+const char *msgtypes[] = {
 	"",
 	"RTM_ADD: Add Route",
 	"RTM_DELETE: Delete Route",
@@ -1396,8 +1395,8 @@
 char addrnames[] =
 "\1DST\2GATEWAY\3NETMASK\4GENMASK\5IFP\6IFA\7AUTHOR\010BRD";
-void
-print_rtmsg(struct rt_msghdr *rtm, int msglen)
+static void
+print_rtmsg(struct rt_msghdr *rtm, int msglen __unused)
 {
 	struct if_msghdr *ifm;
 	struct ifa_msghdr *ifam;
@@ -1464,7 +1463,7 @@
 	}
 }
-void
+static void
 print_getmsg(struct rt_msghdr *rtm, int msglen)
 {
 	struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL;
@@ -1558,7 +1557,7 @@
 #undef	RTA_IGN
 }
-void
+static void
 pmsg_common(struct rt_msghdr *rtm)
 {
 	printf("\nlocks: ");
@@ -1568,7 +1567,7 @@
 	pmsg_addrs(((char *)(rtm + 1)), rtm->rtm_addrs);
 }
-void
+static void
 pmsg_addrs(char *cp, int addrs)
 {
 	struct sockaddr *sa;
@@ -1591,15 +1590,15 @@
 	fflush(stdout);
 }
-void
-bprintf(FILE *fp, int b, u_char *s)
+static void
+bprintf(FILE *fp, int b, u_char *str)
 {
 	int i;
 	int gotsome = 0;
 	if (b == 0)
 		return;
-	while ((i = *s++) != 0) {
+	while ((i = *str++) != 0) {
 		if (b & (1 << (i-1))) {
 			if (gotsome == 0)
 				i = '<';
@@ -1607,11 +1606,11 @@
 				i = ',';
 			putc(i, fp);
 			gotsome = 1;
-			for (; (i = *s) > 32; s++)
+			for (; (i = *str) > 32; str++)
 				putc(i, fp);
 		} else
-			while (*s > 32)
-				s++;
+			while (*str > 32)
+				str++;
 	}
 	if (gotsome)
 		putc('>', fp);
@@ -1627,8 +1626,8 @@
 	return(kt->kt_i);
 }
-void
-sodump(sup su, char *which)
+static void
+sodump(sup su, const char *which)
 {
 	switch (su->sa.sa_family) {
 	case AF_LINK:
@@ -1662,7 +1661,7 @@
 #define	END	(4*1)
 #define DELIM	(4*2)
-void
+static void
 sockaddr(char *addr, struct sockaddr *sa)
 {
 	char *cp = (char *)sa;
@@ -1704,7 +1703,7 @@
 	sa->sa_len = cp - (char *)sa;
 }
-int
+static int
 atalk_aton(const char *text, struct at_addr *addr)
 {
 	u_int net, node;
@@ -1717,7 +1716,7 @@
 	return(1);
 }
-char *
+static char *
 atalk_ntoa(struct at_addr at)
 {
 	static char buf[20];
Index: show.c
===================================================================
RCS file: /opt/df_cvs/src/sbin/route/show.c,v
retrieving revision 1.3
diff -u -r1.3 show.c
--- show.c	23 Mar 2004 18:25:51 -0000	1.3
+++ show.c	5 Mar 2005 04:12:05 -0000
@@ -84,18 +84,14 @@
 	{ RTF_PROTO1,	'1' },
 	{ RTF_PROTO2,	'2' },
 	{ RTF_PROTO3,	'3' },
-	{ 0 }
+	{ 0, 0 }
 };
-static void p_rtentry(struct rt_msghdr *);
-static int p_sockaddr(struct sockaddr *, int, int);
-static void p_flags(int, char *);
-static void pr_rthdr(void);
-static void pr_family(int);
-
-int	keyword(char *);
-void	usage(char *);
-void	show(int argc, char *argv[]);
+static void	p_rtentry(struct rt_msghdr *);
+static int	p_sockaddr(struct sockaddr *, int, int);
+static void	p_flags(int, const char *);
+static void	pr_rthdr(void);
+static void	pr_family(int);
 /*
  * Print routing tables.
@@ -247,7 +243,7 @@
 static void
 pr_family(int af)
 {
-	char *afname;
+	const char *afname;
 	switch (af) {
 	case AF_INET:
@@ -286,8 +282,9 @@
 static int
 p_sockaddr(struct sockaddr *sa, int flags, int width)
 {
-	char workbuf[128], *cplim;
+	char workbuf[128];
 	char *cp = workbuf;
+	const char *cplim;
 	int len = sizeof(workbuf);
 	int count;
@@ -331,11 +328,12 @@

 	case AF_INET:
 	    {
-		struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+		struct sockaddr_in *in = (struct sockaddr_in *)sa;
-		if (sin->sin_addr.s_addr == 0)
-			cp = "default";
-		else
+		if (in->sin_addr.s_addr == 0) {
+			/* cp points to workbuf */
+			strncpy(cp, "default", len);
+		} else
 			cp = (flags & RTF_HOST) ? routename(sa) : netname(sa);
 		break;
 	    }
@@ -343,12 +341,22 @@
 #ifdef INET6
 	case AF_INET6:
 	    {
-		struct sockaddr_in6 *sin = (struct sockaddr_in6 *)sa;
+		struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)sa;
-		cp = IN6_IS_ADDR_UNSPECIFIED(&sin->sin6_addr) ? "default" :
-			((flags & RTF_HOST) ?  routename(sa) :	netname(sa));
-		/* make sure numeric address is not truncated */
-		if (strchr(cp, ':') != NULL && strlen(cp) > width)
+		if (IN6_IS_ADDR_UNSPECIFIED(&in6->sin6_addr)) {
+			/* cp points to workbuf */
+			strncpy(cp, "default", len);
+		} else {
+			cp = ((flags & RTF_HOST) ? routename(sa)
+						 : netname(sa));
+		}
+		/*
+		 * If width < 0, it is certain that no truncation will heppen.
+		 * If width >= 0, we have to make sure numeric address is not
+		 * truncated, also in this case type cast is safe.
+		 */
+		if (strchr(cp, ':') != NULL &&
+		    width >= 0 && strlen(cp) > (size_t)width)
 			width = strlen(cp);
 		break;
 	    }
@@ -400,7 +408,7 @@
 }
 static void
-p_flags(int f, char *format)
+p_flags(int f, const char *format)
 {
 	char name[33], *flags;
 	const struct bits *p = bits;
--
Genie in the flask




More information about the Submit mailing list