svn commit: r310383 - head/usr.sbin/syslogd

Hiroki Sato hrs at FreeBSD.org
Thu Dec 22 05:23:39 UTC 2016


Author: hrs
Date: Thu Dec 22 05:23:38 2016
New Revision: 310383
URL: https://svnweb.freebsd.org/changeset/base/310383

Log:
  - Simplify masklen->netmask conversion for AF_INET6.
  - Use iov[N] by array index instead of using pointer v = &iov[0] to
    make the compiler catch an out-of-range access of the array.

Modified:
  head/usr.sbin/syslogd/syslogd.c

Modified: head/usr.sbin/syslogd/syslogd.c
==============================================================================
--- head/usr.sbin/syslogd/syslogd.c	Thu Dec 22 00:35:12 2016	(r310382)
+++ head/usr.sbin/syslogd/syslogd.c	Thu Dec 22 05:23:38 2016	(r310383)
@@ -127,9 +127,10 @@ static const char include_ext[] = ".conf
 #define	MAXUNAMES	20	/* maximum number of user names */
 
 #define	sstosa(ss)	((struct sockaddr *)(ss))
-#define	satosin6(sa)	((struct sockaddr_in6 *)(void *)(sa))
-#define	sstosin(ss)	((struct sockaddr_in *)(ss))
+#define	sstosin(ss)	((struct sockaddr_in *)(void *)(ss))
 #define	satosin(sa)	((struct sockaddr_in *)(void *)(sa))
+#define	sstosin6(ss)	((struct sockaddr_in6 *)(void *)(ss))
+#define	satosin6(sa)	((struct sockaddr_in6 *)(void *)(sa))
 #define	s6_addr32	__u6_addr.__u6_addr32
 #define	IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)	(	\
 	(((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \
@@ -1147,37 +1148,40 @@ static void
 fprintlog(struct filed *f, int flags, const char *msg)
 {
 	struct iovec iov[IOV_SIZE];
-	struct iovec *v;
 	struct addrinfo *r;
 	int l, lsent = 0;
 	char line[MAXLINE + 1], repbuf[80], greetings[200], *wmsg = NULL;
 	char nul[] = "", space[] = " ", lf[] = "\n", crlf[] = "\r\n";
 	const char *msgret;
 
-	v = iov;
 	if (f->f_type == F_WALL) {
-		v->iov_base = greetings;
 		/* The time displayed is not synchornized with the other log
 		 * destinations (like messages).  Following fragment was using
 		 * ctime(&now), which was updating the time every 30 sec.
 		 * With f_lasttime, time is synchronized correctly.
 		 */
-		v->iov_len = snprintf(greetings, sizeof greetings,
-		    "\r\n\7Message from syslogd@%s at %.24s ...\r\n",
-		    f->f_prevhost, f->f_lasttime);
-		if (v->iov_len >= sizeof greetings)
-			v->iov_len = sizeof greetings - 1;
-		v++;
-		v->iov_base = nul;
-		v->iov_len = 0;
-		v++;
+		iov[0] = (struct iovec){
+			.iov_base = greetings,
+			.iov_len = snprintf(greetings, sizeof(greetings),
+				    "\r\n\7Message from syslogd@%s "
+				    "at %.24s ...\r\n",
+				    f->f_prevhost, f->f_lasttime)
+		};
+		if (iov[0].iov_len >= sizeof(greetings))
+			iov[0].iov_len = sizeof(greetings) - 1;
+		iov[1] = (struct iovec){
+			.iov_base = nul,
+			.iov_len = 0
+		};
 	} else {
-		v->iov_base = f->f_lasttime;
-		v->iov_len = strlen(f->f_lasttime);
-		v++;
-		v->iov_base = space;
-		v->iov_len = 1;
-		v++;
+		iov[0] = (struct iovec){
+			.iov_base = f->f_lasttime,
+			.iov_len = strlen(f->f_lasttime)
+		};
+		iov[1] = (struct iovec){
+			.iov_base = space,
+			.iov_len = 1
+		};
 	}
 
 	if (LogFacPri) {
@@ -1214,39 +1218,46 @@ fprintlog(struct filed *f, int flags, co
 		  p_s = p_n;
 		}
 		snprintf(fp_buf, sizeof fp_buf, "<%s.%s> ", f_s, p_s);
-		v->iov_base = fp_buf;
-		v->iov_len = strlen(fp_buf);
+		iov[2] = (struct iovec){
+			.iov_base = fp_buf,
+			.iov_len = strlen(fp_buf)
+		};
 	} else {
-		v->iov_base = nul;
-		v->iov_len = 0;
-	}
-	v++;
-
-	v->iov_base = f->f_prevhost;
-	v->iov_len = strlen(v->iov_base);
-	v++;
-	v->iov_base = space;
-	v->iov_len = 1;
-	v++;
-
+		iov[2] = (struct iovec){
+			.iov_base = nul,
+			.iov_len = 0
+		};
+	}
+	iov[3] = (struct iovec){
+		.iov_base = f->f_prevhost,
+		.iov_len = strlen(f->f_prevhost)
+	};
+	iov[4] = (struct iovec){
+		.iov_base = space,
+		.iov_len = 1
+	};
 	if (msg) {
 		wmsg = strdup(msg); /* XXX iov_base needs a `const' sibling. */
 		if (wmsg == NULL) {
 			logerror("strdup");
 			exit(1);
 		}
-		v->iov_base = wmsg;
-		v->iov_len = strlen(msg);
+		iov[5] = (struct iovec){
+			.iov_base = wmsg,
+			.iov_len = strlen(msg)
+		};
 	} else if (f->f_prevcount > 1) {
-		v->iov_base = repbuf;
-		v->iov_len = snprintf(repbuf, sizeof repbuf,
-		    "last message repeated %d times", f->f_prevcount);
+		iov[5] = (struct iovec){
+			.iov_base = repbuf,
+			.iov_len = snprintf(repbuf, sizeof(repbuf),
+			    "last message repeated %d times", f->f_prevcount)
+		};
 	} else {
-		v->iov_base = f->f_prevline;
-		v->iov_len = f->f_prevlen;
+		iov[5] = (struct iovec){
+			.iov_base = f->f_prevline,
+			.iov_len = f->f_prevlen
+		};
 	}
-	v++;
-
 	dprintf("Logging to %s", TypeNames[f->f_type]);
 	f->f_time = now;
 
@@ -1325,8 +1336,10 @@ fprintlog(struct filed *f, int flags, co
 
 	case F_FILE:
 		dprintf(" %s\n", f->fu_fname);
-		v->iov_base = lf;
-		v->iov_len = 1;
+		iov[6] = (struct iovec){
+			.iov_base = lf,
+			.iov_len = 1
+		};
 		if (writev(f->f_file, iov, nitems(iov)) < 0) {
 			/*
 			 * If writev(2) fails for potentially transient errors
@@ -1347,8 +1360,10 @@ fprintlog(struct filed *f, int flags, co
 
 	case F_PIPE:
 		dprintf(" %s\n", f->fu_pipe_pname);
-		v->iov_base = lf;
-		v->iov_len = 1;
+		iov[6] = (struct iovec){
+			.iov_base = lf,
+			.iov_len = 1
+		};
 		if (f->fu_pipe_pid == 0) {
 			if ((f->f_file = p_open(f->fu_pipe_pname,
 						&f->fu_pipe_pid)) < 0) {
@@ -1378,9 +1393,10 @@ fprintlog(struct filed *f, int flags, co
 
 	case F_TTY:
 		dprintf(" %s%s\n", _PATH_DEV, f->fu_fname);
-		v->iov_base = crlf;
-		v->iov_len = 2;
-
+		iov[6] = (struct iovec){
+			.iov_base = crlf,
+			.iov_len = 2
+		};
 		errno = 0;	/* ttymsg() only sometimes returns an errno */
 		if ((msgret = ttymsg(iov, nitems(iov), f->fu_fname, 10))) {
 			f->f_type = F_UNUSED;
@@ -1391,8 +1407,10 @@ fprintlog(struct filed *f, int flags, co
 	case F_USERS:
 	case F_WALL:
 		dprintf("\n");
-		v->iov_base = crlf;
-		v->iov_len = 2;
+		iov[6] = (struct iovec){
+			.iov_base = crlf,
+			.iov_len = 2
+		};
 		wallmsg(f, iov, nitems(iov));
 		break;
 	}
@@ -2371,8 +2389,7 @@ allowaddr(char *s)
 	struct addrinfo hints, *res;
 	in_addr_t *addrp, *maskp;
 #ifdef INET6
-	int i;
-	u_int32_t *addr6p, *mask6p;
+	uint32_t *addr6p, *mask6p;
 #endif
 	char ip[NI_MAXHOST];
 
@@ -2433,8 +2450,8 @@ allowaddr(char *s)
 		memcpy(&ap->a_addr, res->ai_addr, res->ai_addrlen);
 		memset(&ap->a_mask, 0, sizeof(ap->a_mask));
 		ap->a_mask.ss_family = res->ai_family;
+		ap->a_mask.ss_len = res->ai_addrlen;
 		if (res->ai_family == AF_INET) {
-			ap->a_mask.ss_len = sizeof(struct sockaddr_in);
 			maskp = &sstosin(&ap->a_mask)->sin_addr.s_addr;
 			addrp = &sstosin(&ap->a_addr)->sin_addr.s_addr;
 			if (masklen < 0) {
@@ -2459,24 +2476,23 @@ allowaddr(char *s)
 		}
 #ifdef INET6
 		else if (res->ai_family == AF_INET6 && masklen <= 128) {
-			ap->a_mask.ss_len = sizeof(struct sockaddr_in6);
 			if (masklen < 0)
 				masklen = 128;
-			mask6p = (u_int32_t *)&((struct sockaddr_in6 *)&ap->a_mask)->sin6_addr;
+			mask6p = (uint32_t *)&sstosin6(&ap->a_mask)->sin6_addr.s6_addr32[0];
+			addr6p = (uint32_t *)&sstosin6(&ap->a_addr)->sin6_addr.s6_addr32[0];
 			/* convert masklen to netmask */
 			while (masklen > 0) {
 				if (masklen < 32) {
-					*mask6p = htonl(~(0xffffffff >> masklen));
+					*mask6p =
+					    htonl(~(0xffffffff >> masklen));
+					*addr6p &= *mask6p;
 					break;
+				} else {
+					*mask6p++ = 0xffffffff;
+					addr6p++;
+					masklen -= 32;
 				}
-				*mask6p++ = 0xffffffff;
-				masklen -= 32;
 			}
-			/* Lose any host bits in the network number. */
-			mask6p = (u_int32_t *)&((struct sockaddr_in6 *)&ap->a_mask)->sin6_addr;
-			addr6p = (u_int32_t *)&((struct sockaddr_in6 *)&ap->a_addr)->sin6_addr;
-			for (i = 0; i < 4; i++)
-				addr6p[i] &= mask6p[i];
 		}
 #endif
 		else {


More information about the svn-src-all mailing list