summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2015-10-25 22:17:43 +0000
committerngie <ngie@FreeBSD.org>2015-10-25 22:17:43 +0000
commit27789be2f50792480e407494b16b80bb9d1c9f07 (patch)
tree840e95a05039118b302aa33ec7bcd210f3b580f1
parentf733542c6cc57cf57b34b0e78fe737ad7c882794 (diff)
downloadFreeBSD-src-27789be2f50792480e407494b16b80bb9d1c9f07.zip
FreeBSD-src-27789be2f50792480e407494b16b80bb9d1c9f07.tar.gz
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@isilon.com> Sponsored by: EMC / Isilon Storage Division
-rw-r--r--usr.sbin/syslogd/syslogd.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index bc054b8..a809543 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -339,6 +339,18 @@ static int waitdaemon(int, int, int);
static void timedout(int);
static void increase_rcvbuf(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[])
{
@@ -986,7 +998,8 @@ logmsg(int pri, const char *msg, const char *from, int flags)
(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;
@@ -1275,8 +1288,7 @@ fprintlog(struct filed *f, int flags, const char *msg)
*/
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);
}
@@ -1300,7 +1312,7 @@ fprintlog(struct filed *f, int flags, const char *msg)
}
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);
@@ -1408,7 +1420,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);
@@ -1512,7 +1524,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;
}
}
@@ -1578,11 +1590,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);
}
OpenPOWER on IntegriCloud