From 1714e0ffda337ccb0f02cba0f3cf8119675c8ddd Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 28 Mar 2009 20:54:53 +0100 Subject: [PATCH] [BUG] stream_sock: disable I/O on fds reporting an error Upon read or write error, we cannot immediately close the FD because we want to first report the error to the upper layer which will do it itself. However, we want to prevent any further I/O from being performed on the FD. This is especially important in case of speculative I/O where nothing else could stop the FD from still being polled until the upper layer takes care of the condition. --- src/stream_sock.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/stream_sock.c b/src/stream_sock.c index 30d6b6227..9337df81d 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -495,6 +495,7 @@ int stream_sock_read(int fd) { fdtab[fd].state = FD_STERROR; fdtab[fd].ev &= ~FD_POLL_STICKY; + EV_FD_REM(fd); si->flags |= SI_FL_ERR; retval = 1; goto out_wakeup; @@ -756,6 +757,7 @@ int stream_sock_write(int fd) fdtab[fd].state = FD_STERROR; fdtab[fd].ev &= ~FD_POLL_STICKY; + EV_FD_REM(fd); si->flags |= SI_FL_ERR; task_wakeup(si->owner, TASK_WOKEN_IO); return 1; @@ -972,6 +974,7 @@ void stream_sock_chk_snd(struct stream_interface *si) */ fdtab[si->fd].state = FD_STERROR; fdtab[si->fd].ev &= ~FD_POLL_STICKY; + EV_FD_REM(si->fd); si->flags |= SI_FL_ERR; goto out_wakeup; }