From: anton Date: Fri, 22 Oct 2021 05:00:26 +0000 (+0000) Subject: Preserve pipe select(2) semantics when the other end of the pipe is gone. X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=7c9ec6336b897e0e7e4513690a5d0669dc1b235c;p=openbsd Preserve pipe select(2) semantics when the other end of the pipe is gone. In preparation for implementing select(2) on top of kqueue. ok mpi@ --- diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index f9bae89aa46..fa855710712 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_pipe.c,v 1.126 2020/12/30 17:02:32 visa Exp $ */ +/* $OpenBSD: sys_pipe.c,v 1.127 2021/10/22 05:00:26 anton Exp $ */ /* * Copyright (c) 1996 John S. Dyson @@ -890,16 +890,27 @@ pipe_kqfilter(struct file *fp, struct knote *kn) kn->kn_hook = rpipe; klist_insert_locked(&rpipe->pipe_sel.si_note, kn); break; - case EVFILT_WRITE: + case EVFILT_WRITE: { + struct pipe *kpipe = wpipe; + if (wpipe == NULL) { /* other end of pipe has been closed */ - error = EPIPE; - break; + if (kn->kn_flags & __EV_POLL) { + /* + * select(2) semantics requires the pipe to + * become ready only to deliver EPIPE. + */ + kpipe = rpipe; + } else { + error = EPIPE; + break; + } } kn->kn_fop = &pipe_wfiltops; - kn->kn_hook = wpipe; - klist_insert_locked(&wpipe->pipe_sel.si_note, kn); + kn->kn_hook = kpipe; + klist_insert_locked(&kpipe->pipe_sel.si_note, kn); break; + } default: error = EINVAL; }