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