mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-07 22:12:08 +00:00
MINOR: raw-sock: always check for CO_FL_SOCK_WR_SH before sending
The test was added before splice() and send() to make sure we never accidently send after a shutdown, because upper layers do not all check and it's not their job to do it. In such a case we also set errno to EPIPE so that the error can be accurately reported, e.g., in health checks.
This commit is contained in:
parent
49139cb914
commit
a8c7e8e3a8
@ -185,6 +185,13 @@ int raw_sock_from_pipe(struct connection *conn, void *xprt_ctx, struct pipe *pip
|
||||
if (!fd_send_ready(conn->handle.fd))
|
||||
return 0;
|
||||
|
||||
if (conn->flags & CO_FL_SOCK_WR_SH) {
|
||||
/* it's already closed */
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH;
|
||||
errno = EPIPE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
done = 0;
|
||||
while (pipe->data) {
|
||||
ret = splice(pipe->cons, NULL, conn->handle.fd, NULL, pipe->data,
|
||||
@ -351,6 +358,13 @@ static size_t raw_sock_from_buf(struct connection *conn, void *xprt_ctx, const s
|
||||
if (!fd_send_ready(conn->handle.fd))
|
||||
return 0;
|
||||
|
||||
if (conn->flags & CO_FL_SOCK_WR_SH) {
|
||||
/* it's already closed */
|
||||
conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH;
|
||||
errno = EPIPE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
done = 0;
|
||||
/* send the largest possible block. For this we perform only one call
|
||||
* to send() unless the buffer wraps and we exactly fill the first hunk,
|
||||
|
Loading…
Reference in New Issue
Block a user