Hi,
syslogd tries to ignore EAGAIN for tty. Unfortunately it closes
the file descriptor before checking the errno. So f_file contains
a bad file descriptor that may be reused at the next open.
I think f_file should not be closed if the errno is EAGAIN.
If I move the close down, f_file is overwritten in all cases.
ok?
bluhm
Index: usr.sbin/syslogd/syslogd.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/syslogd/syslogd.c,v
retrieving revision 1.246
diff -u -p -r1.246 syslogd.c
--- usr.sbin/syslogd/syslogd.c 12 Sep 2017 15:17:20 -0000 1.246
+++ usr.sbin/syslogd/syslogd.c 16 Sep 2017 00:16:38 -0000
@@ -2045,7 +2045,6 @@ fprintlog(struct filed *f, int flags, ch
break;
}
- (void)close(f->f_file);
/*
* Check for errors on TTY's or program pipes.
* Errors happen due to loss of tty or died programs.
@@ -2056,7 +2055,10 @@ fprintlog(struct filed *f, int flags, ch
* This can happen when logging to a locked tty.
*/
break;
- } else if ((e == EIO || e == EBADF) &&
+ }
+
+ (void)close(f->f_file);
+ if ((e == EIO || e == EBADF) &&
f->f_type != F_FILE && f->f_type != F_PIPE &&
!retryonce) {
f->f_file = priv_open_tty(f->f_un.f_fname);