diff --git a/src/connection.c b/src/connection.c index 78d28ed33..456d1bd2c 100644 --- a/src/connection.c +++ b/src/connection.c @@ -438,6 +438,7 @@ int conn_recv_proxy(struct connection *conn, int flag) recv_abort: conn->err_code = CO_ER_PRX_ABORT; + conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; goto fail; fail: @@ -574,6 +575,7 @@ int conn_local_send_proxy(struct connection *conn, unsigned int flag) goto out_wait; if (errno == EINTR) continue; + conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; goto out_error; } } while (0); diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 21b17715c..a1c69a278 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -625,7 +625,7 @@ int tcp_connect_probe(struct connection *conn) * and disable polling on this FD. */ - conn->flags |= CO_FL_ERROR; + conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; __conn_sock_stop_both(conn); return 0; } diff --git a/src/raw_sock.c b/src/raw_sock.c index b9bb8dcb1..ec7660439 100644 --- a/src/raw_sock.c +++ b/src/raw_sock.c @@ -85,7 +85,7 @@ int raw_sock_to_pipe(struct connection *conn, struct pipe *pipe, unsigned int co /* report error on POLL_ERR before connection establishment */ if ((fdtab[conn->t.sock.fd].ev & FD_POLL_ERR) && (conn->flags & CO_FL_WAIT_L4_CONN)) { - conn->flags |= CO_FL_ERROR; + conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; return retval; } } @@ -236,7 +236,7 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun /* report error on POLL_ERR before connection establishment */ if ((fdtab[conn->t.sock.fd].ev & FD_POLL_ERR) && (conn->flags & CO_FL_WAIT_L4_CONN)) { - conn->flags |= CO_FL_ERROR; + conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; return done; } } @@ -284,7 +284,7 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun break; } else if (errno != EINTR) { - conn->flags |= CO_FL_ERROR; + conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; break; } } @@ -305,7 +305,7 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun * an error without checking. */ if (unlikely(fdtab[conn->t.sock.fd].ev & FD_POLL_ERR)) - conn->flags |= CO_FL_ERROR; + conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; return done; } @@ -359,7 +359,7 @@ static int raw_sock_from_buf(struct connection *conn, struct buffer *buf, int fl break; } else if (errno != EINTR) { - conn->flags |= CO_FL_ERROR; + conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; break; } } diff --git a/src/stream_interface.c b/src/stream_interface.c index 702e7b38b..460099441 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -472,6 +472,7 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag) goto out_wait; if (errno == EINTR) continue; + conn->flags |= CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; goto out_error; }