mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-10 09:07:02 +02:00
MEDIUM: connection: add check for readiness in I/O handlers
The recv/send callbacks must check for readiness themselves instead of having their callers do it. This will strengthen the test and will also ensure we never refrain from calling a handshake handler because a direction is being polled while the other one is ready.
This commit is contained in:
parent
e1f50c4b02
commit
fd803bb4d7
@ -120,7 +120,7 @@ int conn_fd_handler(int fd)
|
|||||||
if (unlikely(conn->flags & (CO_FL_HANDSHAKE | CO_FL_ERROR)))
|
if (unlikely(conn->flags & (CO_FL_HANDSHAKE | CO_FL_ERROR)))
|
||||||
goto process_handshake;
|
goto process_handshake;
|
||||||
|
|
||||||
if (unlikely(conn->flags & CO_FL_WAIT_L4_CONN) && fd_send_ready(conn->t.sock.fd)) {
|
if (unlikely(conn->flags & CO_FL_WAIT_L4_CONN)) {
|
||||||
/* still waiting for a connection to establish and nothing was
|
/* still waiting for a connection to establish and nothing was
|
||||||
* attempted yet to probe the connection. Then let's retry the
|
* attempted yet to probe the connection. Then let's retry the
|
||||||
* connect().
|
* connect().
|
||||||
@ -255,6 +255,9 @@ int conn_recv_proxy(struct connection *conn, int flag)
|
|||||||
if (!(conn->flags & CO_FL_CTRL_READY))
|
if (!(conn->flags & CO_FL_CTRL_READY))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
if (!fd_recv_ready(conn->t.sock.fd))
|
||||||
|
return 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
trash.len = recv(conn->t.sock.fd, trash.str, trash.size, MSG_PEEK);
|
trash.len = recv(conn->t.sock.fd, trash.str, trash.size, MSG_PEEK);
|
||||||
if (trash.len < 0) {
|
if (trash.len < 0) {
|
||||||
|
@ -632,6 +632,9 @@ int tcp_connect_probe(struct connection *conn)
|
|||||||
if (!(conn->flags & CO_FL_WAIT_L4_CONN))
|
if (!(conn->flags & CO_FL_WAIT_L4_CONN))
|
||||||
return 1; /* strange we were called while ready */
|
return 1; /* strange we were called while ready */
|
||||||
|
|
||||||
|
if (!fd_send_ready(fd))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* we might be the first witness of FD_POLL_ERR. Note that FD_POLL_HUP
|
/* we might be the first witness of FD_POLL_ERR. Note that FD_POLL_HUP
|
||||||
* without FD_POLL_IN also indicates a hangup without input data meaning
|
* without FD_POLL_IN also indicates a hangup without input data meaning
|
||||||
* there was no connection.
|
* there was no connection.
|
||||||
|
@ -75,7 +75,10 @@ int raw_sock_to_pipe(struct connection *conn, struct pipe *pipe, unsigned int co
|
|||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
|
|
||||||
if (!(conn->flags & CO_FL_CTRL_READY))
|
if (!conn_ctrl_ready(conn))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!fd_recv_ready(conn->t.sock.fd))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@ -193,7 +196,10 @@ int raw_sock_from_pipe(struct connection *conn, struct pipe *pipe)
|
|||||||
{
|
{
|
||||||
int ret, done;
|
int ret, done;
|
||||||
|
|
||||||
if (!(conn->flags & CO_FL_CTRL_READY))
|
if (!conn_ctrl_ready(conn))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!fd_send_ready(conn->t.sock.fd))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
@ -240,7 +246,10 @@ static int raw_sock_to_buf(struct connection *conn, struct buffer *buf, int coun
|
|||||||
int ret, done = 0;
|
int ret, done = 0;
|
||||||
int try;
|
int try;
|
||||||
|
|
||||||
if (!(conn->flags & CO_FL_CTRL_READY))
|
if (!conn_ctrl_ready(conn))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!fd_recv_ready(conn->t.sock.fd))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@ -342,7 +351,10 @@ static int raw_sock_from_buf(struct connection *conn, struct buffer *buf, int fl
|
|||||||
{
|
{
|
||||||
int ret, try, done, send_flag;
|
int ret, try, done, send_flag;
|
||||||
|
|
||||||
if (!(conn->flags & CO_FL_CTRL_READY))
|
if (!conn_ctrl_ready(conn))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!fd_send_ready(conn->t.sock.fd))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
done = 0;
|
done = 0;
|
||||||
|
@ -400,6 +400,9 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag)
|
|||||||
if (!conn_ctrl_ready(conn))
|
if (!conn_ctrl_ready(conn))
|
||||||
goto out_error;
|
goto out_error;
|
||||||
|
|
||||||
|
if (!fd_send_ready(conn->t.sock.fd))
|
||||||
|
goto out_wait;
|
||||||
|
|
||||||
/* If we have a PROXY line to send, we'll use this to validate the
|
/* If we have a PROXY line to send, we'll use this to validate the
|
||||||
* connection, in which case the connection is validated only once
|
* connection, in which case the connection is validated only once
|
||||||
* we've sent the whole proxy line. Otherwise we use connect().
|
* we've sent the whole proxy line. Otherwise we use connect().
|
||||||
|
Loading…
Reference in New Issue
Block a user