Skip to content

Commit

Permalink
syslogd: Increase message size limits
Browse files Browse the repository at this point in the history
Add a -M option to control the maximum length of forwarded messages.
syslogd(8) used to truncate forwarded messages to 1024 bytes, but after
commit 1a874a1 ("Add RFC 5424 syslog message output to syslogd.")
applies a more conservative limit of 480 bytes for IPv4 per RFC 5426
section 3.2.  Restore the old default behaviour of truncating to 1024
bytes.  RFC 5424 specifies no upper limit on the length of forwarded
messages, while for RFC 3164 the limit is 1024 bytes.

Increase MAXLINE to 8192 bytes to correspond to commit 672ef817a192.

Replaced bootfile[] size for MAXPATHLEN used in getbootfile(3) as a
returned value. Using (MAXLINE+1) as a size for bootfile[] is excessive.

PR:		241937
MFC after:	1 month
Differential Revision:	https://reviews.freebsd.org/D27206
  • Loading branch information
dwagin authored and markjdb committed Mar 23, 2021
1 parent 9bd7345 commit 2d82b47
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 12 deletions.
6 changes: 6 additions & 0 deletions usr.sbin/syslogd/syslogd.8
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
.Op Fl b Ar bind_address
.Op Fl f Ar config_file
.Op Fl l Oo Ar mode Ns \&: Oc Ns Ar path
.Op Fl M Ar fwd_length
.Op Fl m Ar mark_interval
.Op Fl O Ar format
.Op Fl P Ar pid_file
Expand Down Expand Up @@ -243,6 +244,11 @@ Usually the
.Dq kern
facility is reserved for messages read directly from
.Pa /dev/klog .
.It Fl M Ar fwd_length
Set the limit on the length of forwarded messages.
The minimum is 480 octets.
The maximum for RFC 3164 output format is 1024 octets.
The default is 1024 octets.
.It Fl m Ar mark_interval
Select the number of minutes between
.Dq mark
Expand Down
33 changes: 21 additions & 12 deletions usr.sbin/syslogd/syslogd.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,7 @@ __FBSDID("$FreeBSD$");
* Priority comparison code by Harlan Stenn.
*/

/* Maximum number of characters in time of last occurrence */
#define MAXLINE 2048 /* maximum line length */
#define MAXLINE 8192 /* maximum line length */
#define MAXSVLINE MAXLINE /* maximum saved line length */
#define DEFUPRI (LOG_USER|LOG_NOTICE)
#define DEFSPRI (LOG_KERN|LOG_CRIT)
Expand Down Expand Up @@ -383,6 +382,7 @@ static int MarkInterval = 20 * 60; /* interval between marks in seconds */
static int MarkSeq; /* mark sequence number */
static int NoBind; /* don't bind() as suggested by RFC 3164 */
static int SecureMode; /* when true, receive only unix domain socks */
static int MaxForwardLen = 1024; /* max length of forwared message */
#ifdef INET6
static int family = PF_UNSPEC; /* protocol family (IPv4, IPv6 or both) */
#else
Expand All @@ -394,7 +394,7 @@ static int use_bootfile; /* log entire bootfile for every kern msg */
static int no_compress; /* don't compress messages (1=pipes, 2=all) */
static int logflags = O_WRONLY|O_APPEND; /* flags used to open log files */

static char bootfile[MAXLINE+1]; /* booted kernel file */
static char bootfile[MAXPATHLEN]; /* booted kernel file */

static int RemoteAddDate; /* Always set the date on remote messages */
static int RemoteHostname; /* Log remote hostname from the message */
Expand Down Expand Up @@ -553,7 +553,7 @@ main(int argc, char *argv[])
if (madvise(NULL, 0, MADV_PROTECT) != 0)
dprintf("madvise() failed: %s\n", strerror(errno));

while ((ch = getopt(argc, argv, "468Aa:b:cCdf:FHkl:m:nNoO:p:P:sS:Tuv"))
while ((ch = getopt(argc, argv, "468Aa:b:cCdf:FHkl:M:m:nNoO:p:P:sS:Tuv"))
!= -1)
switch (ch) {
#ifdef INET
Expand Down Expand Up @@ -666,6 +666,12 @@ main(int argc, char *argv[])
});
break;
}
case 'M': /* max length of forwarded message */
MaxForwardLen = atoi(optarg);
if (MaxForwardLen < 480)
errx(1, "minimum length limit of forwarded "
"messages is 480 bytes");
break;
case 'm': /* mark interval */
MarkInterval = atoi(optarg) * 60;
break;
Expand Down Expand Up @@ -710,6 +716,9 @@ main(int argc, char *argv[])
if ((argc -= optind) != 0)
usage();

if (RFC3164OutputFormat && MaxForwardLen > 1024)
errx(1, "RFC 3164 messages may not exceed 1024 bytes");

/* Pipe to catch a signal during select(). */
s = pipe2(sigpipe, O_CLOEXEC);
if (s < 0) {
Expand Down Expand Up @@ -948,9 +957,9 @@ usage(void)
fprintf(stderr,
"usage: syslogd [-468ACcdFHknosTuv] [-a allowed_peer]\n"
" [-b bind_address] [-f config_file]\n"
" [-l [mode:]path] [-m mark_interval]\n"
" [-O format] [-P pid_file] [-p log_socket]\n"
" [-S logpriv_socket]\n");
" [-l [mode:]path] [-M fwd_length]\n"
" [-m mark_interval] [-O format] [-P pid_file]\n"
" [-p log_socket] [-S logpriv_socket]\n");
exit(1);
}

Expand Down Expand Up @@ -1840,27 +1849,27 @@ fprintlog_write(struct filed *f, struct iovlist *il, int flags)

switch (f->f_type) {
case F_FORW:
/* Truncate messages to RFC 5426 recommended size. */
dprintf(" %s", f->fu_forw_hname);
switch (f->fu_forw_addr->ai_family) {
#ifdef INET
case AF_INET:
dprintf(":%d\n",
ntohs(satosin(f->fu_forw_addr->ai_addr)->sin_port));
iovlist_truncate(il, 480);
break;
#endif
#ifdef INET6
case AF_INET6:
dprintf(":%d\n",
ntohs(satosin6(f->fu_forw_addr->ai_addr)->sin6_port));
iovlist_truncate(il, 1180);
break;
#endif
default:
dprintf("\n");
}

/* Truncate messages to maximum forward length. */
iovlist_truncate(il, MaxForwardLen);

lsent = 0;
for (r = f->fu_forw_addr; r; r = r->ai_next) {
memset(&msghdr, 0, sizeof(msghdr));
Expand Down Expand Up @@ -2553,7 +2562,7 @@ init(int signo)
char *p;
char oldLocalHostName[MAXHOSTNAMELEN];
char hostMsg[2*MAXHOSTNAMELEN+40];
char bootfileMsg[LINE_MAX];
char bootfileMsg[MAXLINE + 1];

dprintf("init\n");
WantInitialize = 0;
Expand Down Expand Up @@ -2900,7 +2909,7 @@ cfline(const char *line, const char *prog, const char *host,
int error, i, pri, syncfile;
const char *p, *q;
char *bp, *pfilter_dup;
char buf[MAXLINE], ebuf[100];
char buf[LINE_MAX], ebuf[100];

dprintf("cfline(\"%s\", f, \"%s\", \"%s\", \"%s\")\n", line, prog,
host, pfilter);
Expand Down

0 comments on commit 2d82b47

Please sign in to comment.