--- usr.sbin/syslogd/syslogd.c.orig 2019-11-23 01:36:17.347873000 +0100 +++ usr.sbin/syslogd/syslogd.c 2020-02-24 13:59:47.102903000 +0100 @@ -133,6 +133,7 @@ #include #include #include +#include #include #include #include @@ -141,8 +142,11 @@ #include #include #include +#include #include #include +#include +#include #include "pathnames.h" #include "ttymsg.h" @@ -734,6 +738,9 @@ /* tuck my process id away */ pidfile_write(pfh); + /* set the character set locale */ + setlocale(LC_CTYPE, getenv("LC_CTYPE")); + dprintf("off & running....\n"); tvp = &tv; @@ -911,28 +918,38 @@ static void parsemsg_remove_unsafe_characters(const char *in, char *out, size_t outlen) { - char *q; + const char *p; + char *q, *end_q; int c; + size_t n; + p = in; q = out; - while ((c = (unsigned char)*in++) != '\0' && q < out + outlen - 4) { - if (mask_C1 && (c & 0x80) && c < 0xA0) { - c &= 0x7F; - *q++ = 'M'; - *q++ = '-'; + end_q = out + outlen - 1; + while (*p != '\0' && q < end_q) { + n = mbrtoc32(&c, p, (size_t)MB_LEN_MAX, NULL); + if (n == 0) + break; + if (n < 0 || n > (size_t)MB_LEN_MAX) { + /* Invalid char sequence for this charset. */ + c = *p; + n = (size_t)1; } - if (isascii(c) && iscntrl(c)) { - if (c == '\n') { - *q++ = ' '; - } else if (c == '\t') { - *q++ = '\t'; - } else { - *q++ = '^'; - *q++ = c ^ 0100; - } + if (c == '\n') { + *q++ = ' '; + } else if (c == '\t') { + *q++ = '\t'; + } else if (iswprint(c)) { + if (q > end_q - n) + break; + strncpy(q, p, n); + q += n; } else { - *q++ = c; + if (q > end_q - 4) + break; + q = vis(q, c, 0, 0); } + p += n; } *q = '\0'; }