svn commit: r289950 - stable/9/usr.sbin/syslogd

Garrett Cooper ngie at FreeBSD.org
Sun Oct 25 22:19:13 UTC 2015


Author: ngie
Date: Sun Oct 25 22:19:11 2015
New Revision: 289950
URL: https://svnweb.freebsd.org/changeset/base/289950

Log:
  MFstable/10 r289949:
  
  MFC r286304:
  
  Set f_file to -1/F_UNUSED when after closing when possible
  
  This will help ensure we don't trash file descriptors that get used later on
  in the daemon
  
  Found via internal Coverity scan
  
  Discussed with: cem, ed, markj
  Differential Revision: https://reviews.freebsd.org/D3081
  Submitted by: Miles Ohlrich <miles.ohlrich at isilon.com>
  Sponsored by: EMC / Isilon Storage Division

Modified:
  stable/9/usr.sbin/syslogd/syslogd.c
Directory Properties:
  stable/9/   (props changed)
  stable/9/usr.sbin/   (props changed)
  stable/9/usr.sbin/syslogd/   (props changed)

Modified: stable/9/usr.sbin/syslogd/syslogd.c
==============================================================================
--- stable/9/usr.sbin/syslogd/syslogd.c	Sun Oct 25 22:17:43 2015	(r289949)
+++ stable/9/usr.sbin/syslogd/syslogd.c	Sun Oct 25 22:19:11 2015	(r289950)
@@ -338,6 +338,18 @@ static int	waitdaemon(int, int, int);
 static void	timedout(int);
 static void	double_rbuf(int);
 
+static void
+close_filed(struct filed *f)
+{
+
+	if (f == NULL || f->f_file == -1)
+		return;
+
+	(void)close(f->f_file);
+	f->f_file = -1;
+	f->f_type = F_UNUSED;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -985,7 +997,8 @@ logmsg(int pri, const char *msg, const c
 			(void)strlcpy(f->f_lasttime, timestamp,
 				sizeof(f->f_lasttime));
 			fprintlog(f, flags, msg);
-			(void)close(f->f_file);
+			close(f->f_file);
+			f->f_file = -1;
 		}
 		(void)sigsetmask(omask);
 		return;
@@ -1272,8 +1285,7 @@ fprintlog(struct filed *f, int flags, co
 			 */
 			if (errno != ENOSPC) {
 				int e = errno;
-				(void)close(f->f_file);
-				f->f_type = F_UNUSED;
+				close_filed(f);
 				errno = e;
 				logerror(f->f_un.f_fname);
 			}
@@ -1297,7 +1309,7 @@ fprintlog(struct filed *f, int flags, co
 		}
 		if (writev(f->f_file, iov, IOV_SIZE) < 0) {
 			int e = errno;
-			(void)close(f->f_file);
+			close_filed(f);
 			if (f->f_un.f_pipe.f_pid > 0)
 				deadq_enter(f->f_un.f_pipe.f_pid,
 					    f->f_un.f_pipe.f_pname);
@@ -1405,7 +1417,7 @@ reapchild(int signo __unused)
 		for (f = Files; f; f = f->f_next)
 			if (f->f_type == F_PIPE &&
 			    f->f_un.f_pipe.f_pid == pid) {
-				(void)close(f->f_file);
+				close_filed(f);
 				f->f_un.f_pipe.f_pid = 0;
 				log_deadchild(pid, status,
 					      f->f_un.f_pipe.f_pname);
@@ -1509,7 +1521,7 @@ die(int signo)
 		if (f->f_prevcount)
 			fprintlog(f, 0, (char *)NULL);
 		if (f->f_type == F_PIPE && f->f_un.f_pipe.f_pid > 0) {
-			(void)close(f->f_file);
+			close_filed(f);
 			f->f_un.f_pipe.f_pid = 0;
 		}
 	}
@@ -1575,11 +1587,11 @@ init(int signo)
 		case F_FORW:
 		case F_CONSOLE:
 		case F_TTY:
-			(void)close(f->f_file);
+			close_filed(f);
 			break;
 		case F_PIPE:
 			if (f->f_un.f_pipe.f_pid > 0) {
-				(void)close(f->f_file);
+				close_filed(f);
 				deadq_enter(f->f_un.f_pipe.f_pid,
 					    f->f_un.f_pipe.f_pname);
 			}


More information about the svn-src-all mailing list