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 <jbar...@virtuousgeek.org>
---
 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

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to