core/sysklogd/sysklogd-1.4.1.patch
2006-02-23 15:26:10 +00:00

587 lines
17 KiB
Diff

diff -Nru sysklogd-1.4.1/Makefile sysklogd-1.4.1-new/Makefile
--- sysklogd-1.4.1/Makefile 1998-10-12 22:25:15.000000000 +0200
+++ sysklogd-1.4.1-new/Makefile 2004-09-21 23:00:34.656626400 +0200
@@ -3,13 +3,13 @@
CC= gcc
#CFLAGS= -g -DSYSV -Wall
#LDFLAGS= -g
-CFLAGS= $(RPM_OPT_FLAGS) -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
-LDFLAGS= -s
+CFLAGS= $(RPM_OPT_FLAGS) -DSYSV -D_GNU_SOURCE -Wall
+LDFLAGS=
# Look where your install program is.
INSTALL = /usr/bin/install
-BINDIR = /usr/sbin
-MANDIR = /usr/man
+BINDIR = $(TOPDIR)/sbin
+MANDIR = $(TOPDIR)/usr/man
# There is one report that under an all ELF system there may be a need to
# explicilty link with libresolv.a. If linking syslogd fails you may wish
@@ -106,17 +106,51 @@
${CC} ${CFLAGS} -DTEST -o ksym_test.o -c ksym.c
clean:
- rm -f *.o *.log *~ *.orig
+ rm -f *.o *.log *~ *.orig sysklogd-*.tar.gz syslogd klogd
clobber: clean
rm -f syslogd klogd ksym syslog_tst oops_test TAGS tsyslogd tklogd
install_exec: syslogd klogd
- ${INSTALL} -m 500 -s syslogd ${BINDIR}/syslogd
- ${INSTALL} -m 500 -s klogd ${BINDIR}/klogd
+ ${INSTALL} -m 500 syslogd ${BINDIR}/syslogd
+ ${INSTALL} -m 500 klogd ${BINDIR}/klogd
install_man:
- ${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 sysklogd.8 ${MANDIR}/man8/sysklogd.8
- ${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 syslogd.8 ${MANDIR}/man8/syslogd.8
- ${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 syslog.conf.5 ${MANDIR}/man5/syslog.conf.5
- ${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 klogd.8 ${MANDIR}/man8/klogd.8
+ ${INSTALL} -m 644 sysklogd.8 ${MANDIR}/man8/sysklogd.8
+ ${INSTALL} -m 644 syslogd.8 ${MANDIR}/man8/syslogd.8
+ ${INSTALL} -m 644 syslog.conf.5 ${MANDIR}/man5/syslog.conf.5
+ ${INSTALL} -m 644 klogd.8 ${MANDIR}/man8/klogd.8
+
+
+## Red Hat specific additions
+
+VER1 = $(shell awk '/VERSION/ { print $$3 }' version.h | sed 's|"||g')
+VER2 = $(shell awk '/PATCHLEVEL/ { print $$3 }' version.h | sed 's|"||g')
+VERSION = $(VER1).$(VER2)
+RELEASE = $(shell awk '/Release:/ { print $$2 }' sysklogd.spec.in)
+CVSTAG = sysklogd-$(subst .,_,$(VERSION))-$(subst .,-,$(RELEASE))
+
+changelog:
+ rcs2log | sed "s|@.*redhat\.com|@redhat.com|" | sed "s|@@|@|" | \
+ sed "s|/mnt/devel/CVS/sysklogd/||g" > redhat/changenew
+ mv redhat/ChangeLog redhat/ChangeLog.old
+ cat redhat/changenew redhat/ChangeLog.old > redhat/ChangeLog
+ rm -f redhat/changenew
+
+tag-archive:
+ @cvs -Q tag -F $(CVSTAG)
+
+create-archive:
+ @rm -rf /tmp/sysklogd
+ @cd /tmp ; cvs -Q -d $(CVSROOT) export -r$(CVSTAG) sysklogd || echo "Um... export aborted."
+ @sed 's/VERSIONSUBST/$(VERSION)/' < /tmp/sysklogd/sysklogd.spec.in > /tmp/sysklogd/sysklogd.spec
+ @rm /tmp/sysklogd/sysklogd.spec.in
+ @mv /tmp/sysklogd /tmp/sysklogd-$(VERSION)rh
+ @cd /tmp ; tar -czSpf sysklogd-$(VERSION)rh.tar.gz sysklogd-$(VERSION)rh
+ @rm -rf /tmp/sysklogd-$(VERSION)rh
+ @cp /tmp/sysklogd-$(VERSION)rh.tar.gz .
+ @rm -f /tmp/sysklogd-$(VERSION)rh.tar.gz
+ @echo ""
+ @echo "The final archive is in sysklogd-$(VERSION)rh.tar.gz"
+
+archive: clean tag-archive create-archive
diff -Nru sysklogd-1.4.1/klogd.c sysklogd-1.4.1-new/klogd.c
--- sysklogd-1.4.1/klogd.c 2001-03-11 20:40:10.000000000 +0100
+++ sysklogd-1.4.1-new/klogd.c 2004-09-21 23:00:13.203887712 +0200
@@ -275,6 +275,10 @@
#define ksyslog klogctl
#endif
+#ifndef _PATH_KLOG
+#define _PATH_KLOG "/proc/kmsg"
+#endif
+
#define LOG_BUFFER_SIZE 4096
#define LOG_LINE_LENGTH 1000
@@ -291,7 +295,7 @@
terminate = 0,
caught_TSTP = 0,
reload_symbols = 0,
- console_log_level = -1;
+ console_log_level = 6;
static int use_syscall = 0,
one_shot = 0,
@@ -509,8 +513,7 @@
/* Set level of kernel console messaging.. */
- if ( (console_log_level != -1)
- && (ksyslog(8, NULL, console_log_level) < 0) && \
+ if ( (ksyslog(8, NULL, console_log_level) < 0) && \
(errno == EINVAL) )
{
/*
@@ -887,8 +890,7 @@
value = strtoul(sym_start+1, (char **) 0, 16);
*(line-1) = '>'; /* put back delim */
- symbol = LookupSymbol(value, &sym);
- if ( !symbol_lookup || symbol == (char *) 0 )
+ if ( !symbol_lookup || (symbol = LookupSymbol(value, &sym)) == (char *)0 )
{
parse_state = PARSING_TEXT;
break;
@@ -938,7 +940,7 @@
* messages into this fresh buffer.
*/
memset(log_buffer, '\0', sizeof(log_buffer));
- if ( (rdcnt = ksyslog(2, log_buffer, sizeof(log_buffer))) < 0 )
+ if ( (rdcnt = ksyslog(2, log_buffer, sizeof(log_buffer)-1)) < 0 )
{
if ( errno == EINTR )
return;
@@ -1143,8 +1145,11 @@
if ( one_shot )
{
if (symbol_lookup) {
- InitKsyms(symfile);
- InitMsyms();
+ symbol_lookup = (InitKsyms(symfile) == 1);
+ symbol_lookup |= InitMsyms();
+ if (symbol_lookup == 0) {
+ Syslog(LOG_WARNING, "cannot find any symbols, turning off symbol lookups\n");
+ }
}
if ( (logsrc = GetKernelLogSrc()) == kernel )
LogKernelLine();
@@ -1159,8 +1164,11 @@
#endif
logsrc = GetKernelLogSrc();
if (symbol_lookup) {
- InitKsyms(symfile);
- InitMsyms();
+ symbol_lookup = (InitKsyms(symfile) == 1);
+ symbol_lookup |= InitMsyms();
+ if (symbol_lookup == 0) {
+ Syslog(LOG_WARNING, "cannot find any symbols, turning off symbol lookups\n");
+ }
}
/* The main loop. */
diff -Nru sysklogd-1.4.1/ksym.c sysklogd-1.4.1-new/ksym.c
--- sysklogd-1.4.1/ksym.c 2000-09-12 23:53:31.000000000 +0200
+++ sysklogd-1.4.1-new/ksym.c 2004-09-21 23:00:13.204887560 +0200
@@ -112,6 +112,7 @@
#include <stdlib.h>
#include <malloc.h>
#include <sys/utsname.h>
+#include <ctype.h>
#include "klogd.h"
#include "ksyms.h"
@@ -344,6 +345,7 @@
if ( (sym_file = fopen(symfile, "r")) != (FILE *) 0 ) {
if (CheckMapVersion(symfile) == 1)
file = symfile;
+ fclose(sym_file);
}
if (sym_file == (FILE *) 0 || file == (char *) 0) {
sprintf (symfile, "%s", *mf);
@@ -352,6 +354,7 @@
if ( (sym_file = fopen(symfile, "r")) != (FILE *) 0 ) {
if (CheckMapVersion(symfile) == 1)
file = symfile;
+ fclose(sym_file);
}
}
diff -Nru sysklogd-1.4.1/ksym_mod.c sysklogd-1.4.1-new/ksym_mod.c
--- sysklogd-1.4.1/ksym_mod.c 2000-09-12 23:15:28.000000000 +0200
+++ sysklogd-1.4.1-new/ksym_mod.c 2004-09-21 23:00:13.205887408 +0200
@@ -93,7 +93,7 @@
#include <linux/time.h>
#include <linux/module.h>
#else /* __GLIBC__ */
-#include <linux/module.h>
+#include "module.h"
extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
extern int get_kernel_syms __P ((struct kernel_sym *__table));
#endif /* __GLIBC__ */
diff -Nru sysklogd-1.4.1/module.h sysklogd-1.4.1-new/module.h
--- sysklogd-1.4.1/module.h 1970-01-01 01:00:00.000000000 +0100
+++ sysklogd-1.4.1-new/module.h 2004-09-21 23:00:13.205887408 +0200
@@ -0,0 +1,62 @@
+
+/* Module definitions for klogd's module support */
+struct kernel_sym
+{
+ unsigned long value;
+ char name[60];
+};
+
+struct module_symbol
+{
+ unsigned long value;
+ const char *name;
+};
+
+struct module_ref
+{
+ struct module *dep; /* "parent" pointer */
+ struct module *ref; /* "child" pointer */
+ struct module_ref *next_ref;
+};
+
+struct module_info
+{
+ unsigned long addr;
+ unsigned long size;
+ unsigned long flags;
+ long usecount;
+};
+
+
+typedef struct { volatile int counter; } atomic_t;
+
+struct module
+{
+ unsigned long size_of_struct; /* == sizeof(module) */
+ struct module *next;
+ const char *name;
+ unsigned long size;
+
+ union
+ {
+ atomic_t usecount;
+ long pad;
+ } uc; /* Needs to keep its size - so says rth */
+
+ unsigned long flags; /* AUTOCLEAN et al */
+
+ unsigned nsyms;
+ unsigned ndeps;
+
+ struct module_symbol *syms;
+ struct module_ref *deps;
+ struct module_ref *refs;
+ int (*init)(void);
+ void (*cleanup)(void);
+ const struct exception_table_entry *ex_table_start;
+ const struct exception_table_entry *ex_table_end;
+#ifdef __alpha__
+ unsigned long gp;
+#endif
+};
+
diff -Nru sysklogd-1.4.1/sysklogd.8 sysklogd-1.4.1-new/sysklogd.8
--- sysklogd-1.4.1/sysklogd.8 2001-03-11 20:35:51.000000000 +0100
+++ sysklogd-1.4.1-new/sysklogd.8 2004-09-21 23:00:13.206887256 +0200
@@ -30,6 +30,7 @@
.I domainlist
]
.RB [ " \-v " ]
+.RB [ " \-x " ]
.LP
.SH DESCRIPTION
.B Sysklogd
@@ -152,6 +153,11 @@
.TP
.B "\-v"
Print version and exit.
+.TP
+.B "\-x"
+Disable name lookups when receiving remote messages.
+This avoids deadlocks when the nameserver is running on
+the same machine that runs the syslog daemon.
.LP
.SH SIGNALS
.B Syslogd
diff -Nru sysklogd-1.4.1/syslog_tst.c sysklogd-1.4.1-new/syslog_tst.c
--- sysklogd-1.4.1/syslog_tst.c 1997-06-02 19:21:41.000000000 +0200
+++ sysklogd-1.4.1-new/syslog_tst.c 2004-09-21 23:00:13.206887256 +0200
@@ -42,7 +42,7 @@
if ( (nl = strrchr(bufr, '\n')) != \
(char *) 0)
*nl = '\0';
- syslog(LOG_INFO, bufr);
+ syslog(LOG_INFO, "%s", bufr);
logged += strlen(bufr);
if ( logged > 1024 )
{
@@ -54,7 +54,7 @@
}
else
while (argc-- > 1)
- syslog(LOG_INFO, argv++[1]);
+ syslog(LOG_INFO, "%s", argv++[1]);
}
else
{
diff -Nru sysklogd-1.4.1/syslogd.c sysklogd-1.4.1-new/syslogd.c
--- sysklogd-1.4.1/syslogd.c 2001-03-11 20:40:10.000000000 +0100
+++ sysklogd-1.4.1-new/syslogd.c 2004-09-21 23:00:13.209886800 +0200
@@ -637,8 +637,8 @@
* in seconds after previous message is logged. After each flush,
* we move to the next interval until we reach the largest.
*/
-int repeatinterval[] = { 30, 60 }; /* # of secs before flush */
-#define MAXREPEAT ((sizeof(repeatinterval) / sizeof(repeatinterval[0])) - 1)
+time_t repeatinterval[] = { 30, 60 }; /* # of secs before flush */
+#define MAXREPEAT ((int) ((sizeof(repeatinterval) / sizeof(repeatinterval[0])) - 1))
#define REPEATTIME(f) ((f)->f_time + repeatinterval[(f)->f_repeatcount])
#define BACKOFF(f) { if (++(f)->f_repeatcount > MAXREPEAT) \
(f)->f_repeatcount = MAXREPEAT; \
@@ -730,6 +730,7 @@
int MarkInterval = 20 * 60; /* interval between marks in seconds */
int MarkSeq = 0; /* mark sequence number */
int NoFork = 0; /* don't fork - don't run in daemon mode */
+int DisableDNS = 0; /* don't look up IP addresses of incoming messages */
int AcceptRemote = 0; /* receive messages that come via UDP */
char **StripDomains = NULL; /* these domains may be stripped before writing logs */
char **LocalHosts = NULL; /* these hosts are logged with their hostname */
@@ -743,7 +744,7 @@
char **crunch_list(char *list);
int usage(void);
void untty(void);
-void printchopped(const char *hname, char *msg, int len, int fd);
+void printchopped(const char *hname, char *msg, size_t len, int fd);
void printline(const char *hname, char *msg);
void printsys(char *msg);
void logmsg(int pri, char *msg, const char *from, int flags);
@@ -786,7 +787,7 @@
int len, num_fds;
#else /* __GLIBC__ */
#ifndef TESTING
- size_t len;
+ socklen_t len;
#endif
int num_fds;
#endif /* __GLIBC__ */
@@ -829,7 +830,7 @@
funix[i] = -1;
}
- while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:v")) != EOF)
+ while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:vx")) != EOF)
switch((char)ch) {
case 'a':
if (nfunix < MAXFUNIX)
@@ -877,6 +878,9 @@
case 'v':
printf("syslogd %s.%s\n", VERSION, PATCHLEVEL);
exit (0);
+ case 'x':
+ DisableDNS = 1;
+ break;
case '?':
default:
usage();
@@ -890,11 +894,11 @@
dprintf("Checking pidfile.\n");
if (!check_pid(PidFile))
{
+ signal (SIGTERM, doexit);
if (fork()) {
/*
* Parent process
*/
- signal (SIGTERM, doexit);
sleep(300);
/*
* Not reached unless something major went wrong. 5
@@ -906,6 +910,7 @@
*/
exit(1);
}
+ signal (SIGTERM, SIG_DFL);
num_fds = getdtablesize();
for (i= 0; i < num_fds; i++)
(void) close(i);
@@ -1074,9 +1079,9 @@
(fd_set *) NULL, (struct timeval *) NULL);
if ( restart )
{
+ restart = 0;
dprintf("\nReceived SIGHUP, reloading syslogd.\n");
init();
- restart = 0;
continue;
}
if (nfds == 0) {
@@ -1145,8 +1150,7 @@
dprintf("INET socket error: %d = %s.\n", \
errno, strerror(errno));
logerror("recvfrom inet");
- /* should be harmless now that we set
- * BSDCOMPAT on the socket */
+ /* should be harmless */
sleep(10);
}
}
@@ -1174,7 +1178,7 @@
int usage()
{
- fprintf(stderr, "usage: syslogd [-drvh] [-l hostlist] [-m markinterval] [-n] [-p path]\n" \
+ fprintf(stderr, "usage: syslogd [-drvxh] [-l hostlist] [-m markinterval] [-n] [-p path]\n" \
" [-s domainlist] [-f conffile]\n");
exit(1);
}
@@ -1232,15 +1236,6 @@
close(fd);
return -1;
}
- /* We need to enable BSD compatibility. Otherwise an attacker
- * could flood our log files by sending us tons of ICMP errors.
- */
- if (setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, \
- (char *) &on, sizeof(on)) < 0) {
- logerror("setsockopt(BSDCOMPAT), suspending inet");
- close(fd);
- return -1;
- }
if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
logerror("bind, suspending inet");
close(fd);
@@ -1254,30 +1249,26 @@
crunch_list(list)
char *list;
{
- int count, i;
+ int i, m, n;
char *p, *q;
char **result = NULL;
p = list;
/* strip off trailing delimiters */
- while (p[strlen(p)-1] == LIST_DELIMITER) {
- count--;
+ while (*p && p[strlen(p)-1] == LIST_DELIMITER)
p[strlen(p)-1] = '\0';
- }
/* cut off leading delimiters */
- while (p[0] == LIST_DELIMITER) {
- count--;
+ while (p[0] == LIST_DELIMITER)
p++;
- }
- /* count delimiters to calculate elements */
- for (count=i=0; p[i]; i++)
- if (p[i] == LIST_DELIMITER) count++;
+ /* count delimiters to calculate the number of elements */
+ for (n = i = 0; p[i]; i++)
+ if (p[i] == LIST_DELIMITER) n++;
- if ((result = (char **)malloc(sizeof(char *) * count+2)) == NULL) {
+ if ((result = (char **)malloc(sizeof(char *) * (n + 2))) == NULL) {
printf ("Sorry, can't get enough memory, exiting.\n");
- exit(0);
+ exit(1);
}
/*
@@ -1285,30 +1276,28 @@
* characters are different from any delimiters,
* so we don't have to care about this.
*/
- count = 0;
- while ((q=strchr(p, LIST_DELIMITER))) {
- result[count] = (char *) malloc((q - p + 1) * sizeof(char));
- if (result[count] == NULL) {
+ m = 0;
+ while ((q = strchr(p, LIST_DELIMITER)) && m < n) {
+ result[m] = (char *) malloc((q - p + 1) * sizeof(char));
+ if (result[m] == NULL) {
printf ("Sorry, can't get enough memory, exiting.\n");
- exit(0);
+ exit(1);
}
- strncpy(result[count], p, q - p);
- result[count][q - p] = '\0';
+ memcpy(result[m], p, q - p);
+ result[m][q - p] = '\0';
p = q; p++;
- count++;
+ m++;
}
- if ((result[count] = \
- (char *)malloc(sizeof(char) * strlen(p) + 1)) == NULL) {
+ if ((result[m] = strdup(p)) == NULL) {
printf ("Sorry, can't get enough memory, exiting.\n");
- exit(0);
+ exit(1);
}
- strcpy(result[count],p);
- result[++count] = NULL;
+ result[++m] = NULL;
#if 0
- count=0;
- while (result[count])
- dprintf ("#%d: %s\n", count, StripDomains[count++]);
+ m = 0;
+ while (result[m])
+ dprintf ("#%d: %s\n", m, result[m++]);
#endif
return result;
}
@@ -1346,7 +1335,7 @@
void printchopped(hname, msg, len, fd)
const char *hname;
char *msg;
- int len;
+ size_t len;
int fd;
{
auto int ptlngth;
@@ -1446,6 +1435,7 @@
while ((c = *p++) && q < &line[sizeof(line) - 4]) {
if (c == '\n')
*q++ = ' ';
+#if 0
else if (c < 040) {
*q++ = '^';
*q++ = c ^ 0100;
@@ -1454,7 +1444,9 @@
*q++ = '0' + ((c & 0300) >> 6);
*q++ = '0' + ((c & 0070) >> 3);
*q++ = '0' + (c & 0007);
- } else
+ }
+#endif
+ else
*q++ = c;
}
*q = '\0';
@@ -1839,7 +1831,7 @@
#else
&& e == EBADF) {
#endif
- f->f_file = open(f->f_un.f_fname, O_WRONLY|O_APPEND|O_NOCTTY);
+ f->f_file = open(f->f_un.f_fname, O_WRONLY|O_APPEND|O_NOCTTY|O_LARGEFILE);
if (f->f_file < 0) {
f->f_type = F_UNUSED;
logerror(f->f_un.f_fname);
@@ -1929,7 +1921,7 @@
/* is this slot used? */
if (ut.ut_name[0] == '\0')
continue;
- if (ut.ut_type == LOGIN_PROCESS)
+ if (ut.ut_type != USER_PROCESS)
continue;
if (!(strcmp (ut.ut_name,"LOGIN"))) /* paranoia */
continue;
@@ -2013,7 +2005,10 @@
dprintf("Malformed from address.\n");
return ("???");
}
- hp = gethostbyaddr((char *) &f->sin_addr, sizeof(struct in_addr), \
+ if (DisableDNS)
+ hp = 0;
+ else
+ hp = gethostbyaddr((char *) &f->sin_addr, sizeof(struct in_addr), \
f->sin_family);
if (hp == 0) {
dprintf("Host name for your address (%s) unknown.\n",
@@ -2640,7 +2635,7 @@
f->f_file = open(++p, O_RDWR|O_NONBLOCK);
f->f_type = F_PIPE;
} else {
- f->f_file = open(p, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY,
+ f->f_file = open(p, O_WRONLY|O_APPEND|O_CREAT|O_NOCTTY|O_LARGEFILE,
0644);
f->f_type = F_FILE;
}