aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDmitry Wagin <dmitry.wagin@ya.ru>2021-03-23 16:01:15 +0000
committerMark Johnston <markj@FreeBSD.org>2021-03-23 16:49:58 +0000
commit9bd7345212203924046009e29ce3f1515556f989 (patch)
tree1b7dc3d4acef36b59771b7ec5dbca7b0b8007883 /lib
parent6bcba8dac9a4ddaeabf84ad8d31b1113a9dcf8c2 (diff)
downloadsrc-9bd7345212203924046009e29ce3f1515556f989.tar.gz
src-9bd7345212203924046009e29ce3f1515556f989.zip
libc: Some enhancements to syslog(3)
- Defined MAXLINE constant (8192 octets by default instead 2048) for centralized limit setting up. It sets maximum number of characters of the syslog message. RFC5424 doesn't limit maximum size of the message. Named after MAXLINE in syslogd(8). - Fixed size of fmt_cpy buffer up to MAXLINE for rendering formatted (%m) messages. - Introduced autoexpansion of sending socket buffer up to MAXLINE. MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D27205
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/syslog.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/lib/libc/gen/syslog.c b/lib/libc/gen/syslog.c
index 19d44db0075a..797c7389d1a2 100644
--- a/lib/libc/gen/syslog.c
+++ b/lib/libc/gen/syslog.c
@@ -57,6 +57,9 @@ __FBSDID("$FreeBSD$");
#include "libc_private.h"
+/* Maximum number of characters of syslog message */
+#define MAXLINE 8192
+
static int LogFile = -1; /* fd for log */
static int status; /* connection status */
static int opened; /* have done openlog() */
@@ -141,7 +144,7 @@ vsyslog1(int pri, const char *fmt, va_list ap)
char ch, *p;
long tz_offset;
int cnt, fd, saved_errno;
- char hostname[MAXHOSTNAMELEN], *stdp, tbuf[2048], fmt_cpy[1024],
+ char hostname[MAXHOSTNAMELEN], *stdp, tbuf[MAXLINE], fmt_cpy[MAXLINE],
errstr[64], tz_sign;
FILE *fp, *fmt_fp;
struct bufcookie tbuf_cookie;
@@ -396,9 +399,19 @@ connectlog(void)
struct sockaddr_un SyslogAddr; /* AF_UNIX address of local logger */
if (LogFile == -1) {
+ socklen_t len;
+
if ((LogFile = _socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC,
0)) == -1)
return;
+ if (_getsockopt(LogFile, SOL_SOCKET, SO_SNDBUF, &len,
+ &(socklen_t){sizeof(len)}) == 0) {
+ if (len < MAXLINE) {
+ len = MAXLINE;
+ (void)_setsockopt(LogFile, SOL_SOCKET, SO_SNDBUF,
+ &len, sizeof(len));
+ }
+ }
}
if (LogFile != -1 && status == NOCONN) {
SyslogAddr.sun_len = sizeof(SyslogAddr);