Fix #49: add support for -8 command line option to allow 8-bit data

This patch allows the user to disable the 8-bit data check in the log
message validator.  If you have experienced problems with logging any
unicode (utf-8) messages after v1.6, this option is for you.

The correct way to handle this is to add proper parser support for the
Unicode BOM, defined in RFC5424[1], as NetBSD syslogd does[2], search
for IS_BOM().

[1]: https://datatracker.ietf.org/doc/html/rfc5424#appendix-A.8
[2]: http://cvsweb.netbsd.org/bsdweb.cgi/src/usr.sbin/syslogd/syslogd.c?rev=1.138

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg 2022-03-07 20:51:42 +01:00
parent eb6e85e851
commit 6022d3c7d0
4 changed files with 47 additions and 5 deletions

View File

@ -38,7 +38,7 @@
.Nd log systems messages .Nd log systems messages
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl ?46AdFHKknsTtv .Op Fl ?468AdFHKknsTtv
.Op Fl a Ar addr[/len][:port] .Op Fl a Ar addr[/len][:port]
.Op Fl a Ar name[:port] .Op Fl a Ar name[:port]
.Op Fl b Ar addr[:port] .Op Fl b Ar addr[:port]
@ -129,6 +129,22 @@ to use IPv4 addresses only.
Force Force
.Nm .Nm
to use IPv6 addresses only. to use IPv6 addresses only.
.It Fl 8
Tells
.Nm
not to interfere with 8-bit data. Normally
.Nm
replaces C1 control characters
.Pq ISO 8859 and Unicode characters
with their
.Dq M- Ns Em x
equivalent. Note, this option does not change the way
.Nm
alters control characters
.Pq see Xr iscntrl 3 .
They are always replaced with their
.Dq ^ Ns Em x
equivalent.
.It Fl A .It Fl A
Ordinarily, Ordinarily,
.Nm .Nm

View File

@ -290,11 +290,12 @@ static void sys_seqno_save(void)
int usage(int code) int usage(int code)
{ {
printf("Usage:\n" printf("Usage:\n"
" syslogd [-46AdFHKknsTtv?] [-a PEER] [-b NAME] [-f FILE] [-m INTERVAL]\n" " syslogd [-468AdFHKknsTtv?] [-a PEER] [-b NAME] [-f FILE] [-m INTERVAL]\n"
" [-P PID_FILE] [-p SOCK_PATH] [-r SIZE[:NUM]]\n" " [-P PID_FILE] [-p SOCK_PATH] [-r SIZE[:NUM]]\n"
"Options:\n" "Options:\n"
" -4 Force IPv4 only\n" " -4 Force IPv4 only\n"
" -6 Force IPv6 only\n" " -6 Force IPv6 only\n"
" -8 Allow all 8-bit data, e.g. unicode, does not affect control chars\n"
" -A Send to all addresses in DNS A, or AAAA record\n" " -A Send to all addresses in DNS A, or AAAA record\n"
" -a PEER Allow PEER to use us as a remote syslog sink. Ignored when started\n" " -a PEER Allow PEER to use us as a remote syslog sink. Ignored when started\n"
" with -s. Multiple -a options may be specified:\n" " with -s. Multiple -a options may be specified:\n"
@ -357,7 +358,7 @@ int main(int argc, char *argv[])
char *ptr; char *ptr;
int ch; int ch;
while ((ch = getopt(argc, argv, "46Aa:b:C:dHFf:Kkm:nP:p:r:sTtv?")) != EOF) { while ((ch = getopt(argc, argv, "468Aa:b:C:dHFf:Kkm:nP:p:r:sTtv?")) != EOF) {
switch ((char)ch) { switch ((char)ch) {
case '4': case '4':
family = PF_INET; family = PF_INET;
@ -367,6 +368,10 @@ int main(int argc, char *argv[])
family = PF_INET6; family = PF_INET6;
break; break;
case '8':
mask_C1 = 0;
break;
case 'A': case 'A':
send_to_all++; send_to_all++;
break; break;

View File

@ -1,5 +1,5 @@
EXTRA_DIST = lib.sh opts.sh EXTRA_DIST = lib.sh opts.sh
EXTRA_DIST += api.sh local.sh remote.sh fwd.sh mark.sh EXTRA_DIST += api.sh local.sh unicode.sh remote.sh fwd.sh mark.sh
CLEANFILES = *~ *.trs *.log CLEANFILES = *~ *.trs *.log
TEST_EXTENSIONS = .sh TEST_EXTENSIONS = .sh
TESTS_ENVIRONMENT= unshare -mrun TESTS_ENVIRONMENT= unshare -mrun
@ -12,6 +12,7 @@ api_LDADD = ../src/libsyslog.la
TESTS = opts.sh TESTS = opts.sh
TESTS += local.sh TESTS += local.sh
TESTS += unicode.sh
TESTS += remote.sh TESTS += remote.sh
TESTS += api.sh TESTS += api.sh
TESTS += fwd.sh TESTS += fwd.sh

20
test/unicode.sh Executable file
View File

@ -0,0 +1,20 @@
#!/bin/sh
# Currently only same as local.sh but with unicode messages
# From https://github.com/troglobit/sysklogd/issues/49
# shellcheck disable=SC1090
if [ x"${srcdir}" = x ]; then
srcdir=.
fi
. ${srcdir}/lib.sh
setup -8
MSG="öäüÖÄÜ߀¢§"
MSG2="…‘’•"
../src/logger -u "${SOCK}" ${MSG}
grep ${MSG} "${LOG}" || FAIL "Cannot find: ${MSG}"
../src/logger -u "${ALTSOCK}" ${MSG2}
grep ${MSG2} "${LOG}" || FAIL "Cannot find: ${MSG2}"
OK