summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-02 13:25:33 -0700
committerKeith Packard <keithp@keithp.com>2016-11-15 08:05:15 -0800
commitea8efb3a997e15d27d362762e6c85d59487f9864 (patch)
treec1b25b5a3c0b7f895ea42e3a715e64a55095157c
parent7513da40a656317ad3aa101651d29373de99c798 (diff)
dix: Make sure client is not in output_pending chain after closed (RH 1382444)
I think it is possible that output could get queued to a client during CloseDownClient. After it is removed from the pending queue, active grabs are released, the client is awoken if sleeping and any work queue entries related to the client are processed. To fix this, move the call removing it from the output_pending chain until after clientGone has been set and then check clientGone in output_pending_mark. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1382444 Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--dix/dispatch.c2
-rw-r--r--include/dixstruct.h2
2 files changed, 2 insertions, 2 deletions
diff --git a/dix/dispatch.c b/dix/dispatch.c
index e11137760..3d0fe26fd 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -3406,7 +3406,6 @@ CloseDownClient(ClientPtr client)
UngrabServer(client);
}
mark_client_not_ready(client);
- xorg_list_del(&client->output_pending);
BITCLEAR(grabWaiters, client->index);
DeleteClientFromAnySelections(client);
ReleaseActiveGrabs(client);
@@ -3435,6 +3434,7 @@ CloseDownClient(ClientPtr client)
if (ClientIsAsleep(client))
ClientSignal(client);
ProcessWorkQueueZombies();
+ output_pending_clear(client);
CloseDownConnection(client);
/* If the client made it to the Running stage, nClients has
diff --git a/include/dixstruct.h b/include/dixstruct.h
index 3b578f81a..d71b0ac05 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -159,7 +159,7 @@ extern struct xorg_list output_pending_clients;
static inline void
output_pending_mark(ClientPtr client)
{
- if (xorg_list_is_empty(&client->output_pending))
+ if (!client->clientGone && xorg_list_is_empty(&client->output_pending))
xorg_list_append(&client->output_pending, &output_pending_clients);
}