Commit 943c4466 authored by Alan Somers's avatar Alan Somers
Browse files

Revert "libc: Some enhancements to syslog(3)"

This reverts commit 2886c93d.
The original commit has two problems:

* It sets SO_SNDBUF to be as large as MAXLINE.  But for unix domain
  sockets, the send buffer is bypassed.  Packets go directly to the
  peer's receive buffer, so setting and querying SO_SNDBUF is
  ineffective.  To ensure that the socket can accept messages of a
  certain size, it would be necessary to add a SO_PEERRCVBUF socket
  option that could query the connected peer's receive buffer size.

* It sets MAXLINE to 8 kB, which is larger than the default sockbuf size
  of 4 kB.  That's ok for the builtin syslogd, which sets its recvbuf
  to 80 kB, but not ok for alternative sysloggers, like rsyslogd, which
  use the default size.

As a consequence, writing messages of more than 4 kB with syslog() as a
non-root user while running rsyslogd would cause the logging application
to spin indefinitely within syslog().

PR:		260126
MFC:		2 weeks
Sponsored by:	Axcient
Reviewed by:	markj
Differential Revision: https://reviews.freebsd.org/D33199
parent 10041e99
......@@ -57,9 +57,6 @@ __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() */
......@@ -144,7 +141,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[MAXLINE], fmt_cpy[MAXLINE],
char hostname[MAXHOSTNAMELEN], *stdp, tbuf[2048], fmt_cpy[1024],
errstr[64], tz_sign;
FILE *fp, *fmt_fp;
struct bufcookie tbuf_cookie;
......@@ -399,19 +396,9 @@ 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);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment