Hi,

I could not convince myself that the strings passed to printline()
and parsepriority() are always NUL terminated.  Better safe than
sorry and force a '\0' there.

ok?

bluhm

Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.266
diff -u -p -r1.266 syslogd.c
--- usr.sbin/syslogd/syslogd.c  14 Jul 2021 13:33:57 -0000      1.266
+++ usr.sbin/syslogd/syslogd.c  3 Sep 2021 14:34:36 -0000
@@ -1309,6 +1309,7 @@ tcp_readcb(struct bufferevent *bufev, vo
        /* Maximum frame has 5 digits, 1 space, MAXLINE chars, 1 new line. */
        if (EVBUFFER_LENGTH(bufev->input) >= 5 + 1 + LOG_MAXLINE + 1) {
                log_debug(", use %zu bytes", EVBUFFER_LENGTH(bufev->input));
+               EVBUFFER_DATA(bufev->input)[5 + 1 + LOG_MAXLINE] = '\0';
                printline(p->p_hostname, EVBUFFER_DATA(bufev->input));
                evbuffer_drain(bufev->input, -1);
        } else if (EVBUFFER_LENGTH(bufev->input) > 0)
@@ -1571,7 +1572,8 @@ parsepriority(const char *msg, int *pri)
        if (*msg++ == '<') {
                nlen = strspn(msg, "1234567890");
                if (nlen > 0 && nlen < sizeof(buf) && msg[nlen] == '>') {
-                       strlcpy(buf, msg, nlen + 1);
+                       memcpy(buf, msg, nlen);
+                       buf[nlen] = '\0';
                        maybepri = strtonum(buf, 0, INT_MAX, &errstr);
                        if (errstr == NULL) {
                                *pri = maybepri;

Reply via email to