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.
diff --git a/src/connection.c b/src/connection.c
index 2538cc5..876d71a 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -120,7 +120,7 @@
if (unlikely(conn->flags & (CO_FL_HANDSHAKE | CO_FL_ERROR)))
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
* attempted yet to probe the connection. Then let's retry the
* connect().
@@ -255,6 +255,9 @@
if (!(conn->flags & CO_FL_CTRL_READY))
goto fail;
+ if (!fd_recv_ready(conn->t.sock.fd))
+ return 0;
+
do {
trash.len = recv(conn->t.sock.fd, trash.str, trash.size, MSG_PEEK);
if (trash.len < 0) {