From e469048a0be109b6354cc25728b83be3f8bcfbc5 Mon Sep 17 00:00:00 2001 From: Jesse Barnes Date: Mon, 28 Jun 2010 15:54:33 -0700 Subject: [PATCH 1/2] OS support: fix writeable client vs IgnoreClient behavior When ResetCurrentRequest is called, or IgnoreClient is called when a client has input pending, IgnoredClientsWithInput will be set. However, a subsequent IgnoreClient request will clear the client fd from that fd set, potentially causing the client to hang. So leave the client fd bit in IgnoredClientsWithInput set if needed and clear it in AttendClient if we used it. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=27035. Signed-off-by: Jesse Barnes --- os/connection.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/os/connection.c b/os/connection.c index 61ba72a..a3665b1 100644 --- a/os/connection.c +++ b/os/connection.c @@ -1152,8 +1152,6 @@ IgnoreClient (ClientPtr client) { if (FD_ISSET (connection, &ClientsWithInput)) FD_SET(connection, &IgnoredClientsWithInput); - else - FD_CLR(connection, &IgnoredClientsWithInput); FD_CLR(connection, &ClientsWithInput); FD_CLR(connection, &AllSockets); FD_CLR(connection, &AllClients); @@ -1163,8 +1161,6 @@ IgnoreClient (ClientPtr client) { if (FD_ISSET (connection, &SavedClientsWithInput)) FD_SET(connection, &IgnoredClientsWithInput); - else - FD_CLR(connection, &IgnoredClientsWithInput); FD_CLR(connection, &SavedClientsWithInput); FD_CLR(connection, &SavedAllSockets); FD_CLR(connection, &SavedAllClients); @@ -1187,15 +1183,19 @@ AttendClient (ClientPtr client) FD_SET(connection, &AllClients); FD_SET(connection, &AllSockets); FD_SET(connection, &LastSelectMask); - if (FD_ISSET (connection, &IgnoredClientsWithInput)) + if (FD_ISSET (connection, &IgnoredClientsWithInput)) { FD_SET(connection, &ClientsWithInput); + FD_CLR(connection, &IgnoredClientsWithInput); + } } else { FD_SET(connection, &SavedAllClients); FD_SET(connection, &SavedAllSockets); - if (FD_ISSET(connection, &IgnoredClientsWithInput)) + if (FD_ISSET(connection, &IgnoredClientsWithInput)) { FD_SET(connection, &SavedClientsWithInput); + FD_CLR(connection, &IgnoredClientsWithInput); + } } } -- 1.6.6.1