]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: raw_sock: Make sur the fd and conn are sync.
authorOlivier Houchard <cognet@ci0.org>
Wed, 15 Jan 2020 18:16:23 +0000 (19:16 +0100)
committerOlivier Houchard <cognet@ci0.org>
Wed, 15 Jan 2020 18:16:23 +0000 (19:16 +0100)
Commit 08fa16e397ffb1c6511b98ade2a3bfff9435e521 made sure
we let the fd layer we didn't want to poll anymore if
we failed to send and sendto() returne EAGAIN.
However, just disabling the polling with fd_stop_send()
while not notifying the connection layer means the
connection layer may believe the polling is activated
and nothing needs to be done when it is wrong.
A better fix is to revamp that whole code, for the
time being, just make sure the fd and connection
layer are properly synchronised.

This should fix the problem recently reported on FreeBSD.

src/raw_sock.c

index ed90a02dc70d8b3a5cecc5b81d8ba779c6588d86..197d27d147ceed3f59dc6fb58de826f1978f01a7 100644 (file)
@@ -378,8 +378,10 @@ static size_t raw_sock_from_buf(struct connection *conn, void *xprt_ctx, const s
                        /* if the system buffer is full, don't insist */
                        if (ret < try)
                                break;
-                       if (!count)
-                               fd_stop_send(conn->handle.fd);
+                       if (!count) {
+                               conn_xprt_stop_send(conn);
+                               conn_refresh_polling_flags(conn);
+                       }
                }
                else if (ret == 0 || errno == EAGAIN || errno == ENOTCONN || errno == EINPROGRESS) {
                        /* nothing written, we need to poll for write first */