From owner-svn-src-head@freebsd.org Thu Dec 22 05:23:39 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B1BE0C8CFF3; Thu, 22 Dec 2016 05:23:39 +0000 (UTC) (envelope-from hrs@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 72A051DCB; Thu, 22 Dec 2016 05:23:39 +0000 (UTC) (envelope-from hrs@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id uBM5Nc3s058812; Thu, 22 Dec 2016 05:23:38 GMT (envelope-from hrs@FreeBSD.org) Received: (from hrs@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id uBM5NcNr058811; Thu, 22 Dec 2016 05:23:38 GMT (envelope-from hrs@FreeBSD.org) Message-Id: <201612220523.uBM5NcNr058811@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: hrs set sender to hrs@FreeBSD.org using -f From: Hiroki Sato Date: Thu, 22 Dec 2016 05:23:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r310383 - head/usr.sbin/syslogd X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 22 Dec 2016 05:23:39 -0000 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 {