Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Mar 2001 11:57:27 +0000
From:      Tony Finch <dot@dotat.at>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/25833: LOG_FAC() is bogus
Message-ID:  <E14dWNj-0001Qn-00@hand.dotat.at>

next in thread | raw e-mail | index | archive | help

>Number:         25833
>Category:       bin
>Synopsis:       LOG_FAC() is bogus
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Mar 15 11:20:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Tony Finch <dot@dotat.at>
>Release:        FreeBSD 4.3-BETA i386
>Organization:
Covalent Technologies, Inc.
>Environment:

System: FreeBSD hand.dotat.at 4.3-BETA FreeBSD 4.3-BETA #6: Thu Mar 15 04:57:36 GMT 2001 fanf@hand.dotat.at:/FreeBSD/releng4/sys/compile/DELL-Latitude-CSx i386

>Description:

There was recently a problem with syslogd looping messages that were
printed to the console, because of the following code:
	if (LOG_FAC(pri) == LOG_CONSOLE)
		/* blah */;
the problem being that the value of the LOG_FAC() macro cannot be
compared with a facility value, which is bogus.

There are still a couple of harmless instances of this brokenness
(in syslogd.c and dmesg.c) where the facility in question is
LOG_KERN, which is fortunately zero.

>How-To-Repeat:
>Fix:

This patch sanitizes LOG_FAC(), and adds a LOG_FACSHIFT macro to
replace the lost semantics. I have also replaced uses of LOG_FACMASK
that are now more correctly done with LOG_FAC() (where before that
would have been broken).

An alternative fix would be to replace the code in syslogd.c and
dmesg.c that bogusly compares the value of LOG_FAC() with LOG_KERN.

There's also some code in src/contrib/ipfilter which uses
LOG_PRIMASK and LOG_FACMASK instead of LOG_PRI() and LOG_FAC()
but I haven't touched it since it is contrib code.

Index: sys/sys/syslog.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/syslog.h,v
retrieving revision 1.19.2.1
diff -u -r1.19.2.1 syslog.h
--- sys/sys/syslog.h	2001/01/09 06:51:34	1.19.2.1
+++ sys/sys/syslog.h	2001/03/15 11:54:45
@@ -121,8 +121,9 @@
 
 #define	LOG_NFACILITIES	24	/* current number of facilities */
 #define	LOG_FACMASK	0x03f8	/* mask to extract facility part */
+#define	LOG_FACSHIFT	3	/* number of bits below the facility */
 				/* facility of pri */
-#define	LOG_FAC(p)	(((p) & LOG_FACMASK) >> 3)
+#define	LOG_FAC(p)	((p) & LOG_FACMASK)
 
 #ifdef SYSLOG_NAMES
 CODE facilitynames[] = {
Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.59.2.6
diff -u -r1.59.2.6 syslogd.c
--- usr.sbin/syslogd/syslogd.c	2001/02/18 16:22:59	1.59.2.6
+++ usr.sbin/syslogd/syslogd.c	2001/03/15 11:45:18
@@ -710,7 +710,7 @@
 			pri = 10 * pri + (*p - '0');
 		if (*p == '>')
 			++p;
-		if ((pri & LOG_FACMASK) == LOG_CONSOLE)
+		if (LOG_FAC(pri) == LOG_CONSOLE)
 			flags |= IGN_CONS;
 	} else {
 		/* kernel printf's come out on console */
@@ -771,7 +771,7 @@
 	if (flags & MARK)
 		fac = LOG_NFACILITIES;
 	else
-		fac = LOG_FAC(pri);
+		fac = LOG_FAC(pri) >> LOG_FACSHIFT;
 	prilev = LOG_PRI(pri);
 
 	/* extract program name */
@@ -913,7 +913,7 @@
 
 	if (LogFacPri) {
 	  	static char fp_buf[30];	/* Hollow laugh */
-		int fac = f->f_prevpri & LOG_FACMASK;
+		int fac = LOG_FAC(f->f_prevpri);
 		int pri = LOG_PRI(f->f_prevpri);
 		char *f_s = 0;
 		char f_n[5];	/* Hollow laugh */
@@ -937,7 +937,7 @@
 		  }
 		}
 		if (!f_s) {
-		  snprintf(f_n, sizeof f_n, "%d", LOG_FAC(fac));
+		  snprintf(f_n, sizeof f_n, "%d", fac >> LOG_FACSHIFT);
 		  f_s = f_n;
 		}
 		if (!p_s) {
Index: lib/libc/gen/syslog.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/gen/syslog.c,v
retrieving revision 1.21
diff -u -r1.21 syslog.c
--- lib/libc/gen/syslog.c	2000/01/27 23:06:20	1.21
+++ lib/libc/gen/syslog.c	2001/03/15 11:36:26
@@ -161,7 +161,7 @@
 	saved_errno = errno;
 
 	/* Set default facility if none specified. */
-	if ((pri & LOG_FACMASK) == 0)
+	if (LOG_FAC(pri) == 0)
 		pri |= LogFacility;
 
 	/* Create the primary stdio hook */
>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E14dWNj-0001Qn-00>