]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: fd: HUP is an error only when write is active
authorWilly Tarreau <w@1wt.eu>
Tue, 1 Oct 2019 09:46:40 +0000 (11:46 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 1 Oct 2019 09:52:08 +0000 (11:52 +0200)
William reported that since commit 6b3089856f ("MEDIUM: fd: do not use
the FD_POLL_* flags in the pollers anymore") the master's CLI often
fails to access sub-processes. There are two causes to this. One is
that we did report FD_POLL_ERR on an FD as soon as FD_EV_SHUT_W was
seen, which is automatically inherited from POLLHUP. And since we do
not store the current shutdown state of an FD we can't know if the
poller reports a sudden close resulting from an error or just a
byproduct of a previous shutdown(WR) followed by a read0. The current
patch addresses this by only considering this when the FD was active,
since a shutdown FD is not active. The second issue is that *somewhere*
down the chain, channel data are ignored if an error is reported on a
channel. This results in content truncation, but this cause was not
figured yet.

No backport is needed.

include/proto/fd.h

index 3ee71a5a17a859e82a2278d39a4f7e3e265033a9..8dd64a5b3935d621b28bd2c3edb49904b5e9db5e 100644 (file)
@@ -333,10 +333,13 @@ static inline void fd_update_events(int fd, unsigned char evts)
              ((evts & FD_EV_READY_R) ? FD_POLL_IN  : 0) |
              ((evts & FD_EV_READY_W) ? FD_POLL_OUT : 0) |
              ((evts & FD_EV_SHUT_R)  ? FD_POLL_HUP : 0) |
-             ((evts & FD_EV_SHUT_W)  ? FD_POLL_ERR : 0) |
              ((evts & FD_EV_ERR_R)   ? FD_POLL_ERR : 0) |
              ((evts & FD_EV_ERR_W)   ? FD_POLL_ERR : 0);
 
+       /* SHUTW reported while FD was active for writes is an error */
+       if ((fdtab[fd].ev & FD_EV_ACTIVE_W) && (evts & FD_EV_SHUT_W))
+               new_flags |= FD_POLL_ERR;
+
        old = fdtab[fd].ev;
        new = (old & FD_POLL_STICKY) | new_flags;