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 {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to