[PATCH xserver] dix: Make sure client is not in output_pending chain after closed (RH 1382444)

Hans de Goede hdegoede at redhat.com
Thu Nov 3 11:02:37 UTC 2016


Hi,

On 02-11-16 21:39, Keith Packard wrote:
> 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 at keithp.com>

Patch looks good to me:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> ---
>  dix/dispatch.c      | 2 +-
>  include/dixstruct.h | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index e111377..3d0fe26 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 3b578f8..d71b0ac 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);
>  }
>
>


More information about the xorg-devel mailing list