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);

Reply via email to