On Sat, Sep 16 2017, Alexander Bluhm <alexander.bl...@gmx.net> wrote:
> 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?

ok jca@

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

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to