From: Willy Tarreau Date: Sat, 28 Mar 2009 19:54:53 +0000 (+0100) Subject: [BUG] stream_sock: disable I/O on fds reporting an error X-Git-Tag: v1.3.17~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1714e0ffda337ccb0f02cba0f3cf8119675c8ddd;p=thirdparty%2Fhaproxy.git [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. --- diff --git a/src/stream_sock.c b/src/stream_sock.c index 30d6b62275..9337df81db 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; }