[PATCH xserver] present: Handle event mask updates as specified
Kenneth Graunke
kenneth at whitecape.org
Thu Jul 28 16:57:35 UTC 2016
On Thursday, July 28, 2016 5:58:57 PM PDT Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> From the Present extension specification:
>
> If eventContext specifies an existing event context, then if
> eventMask is empty, PresentSelectInput deletes the specified
> context, otherwise the specified event context is changed to
> select a different set of events.
>
> If eventContext is an unused XID, then if eventMask is empty
> no operation is performed. Otherwise, a new event context is
> created selecting the specified events.
>
> Without this change, there's no way for a client to explicitly change
> or destroy an existing event mask entry. Trying to do so as specified
> above would actually result in a new entry being created with
> the mask value passed in.
>
> While we're at it, fix a memory leak if AddResource fails.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> present/present_event.c | 22 ++++++++++++++++++++--
> present/present_request.c | 2 --
> 2 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/present/present_event.c b/present/present_event.c
> index c586c9a..05862ca 100644
> --- a/present/present_event.c
> +++ b/present/present_event.c
> @@ -209,7 +209,7 @@ int
> present_select_input(ClientPtr client, XID eid, WindowPtr window, CARD32 mask)
> {
> present_window_priv_ptr window_priv = present_get_window_priv(window, mask != 0);
> - present_event_ptr event;
> + present_event_ptr event, next;
>
> if (!window_priv) {
> if (mask)
> @@ -217,6 +217,22 @@ present_select_input(ClientPtr client, XID eid, WindowPtr window, CARD32 mask)
> return Success;
> }
>
> + for (event = window_priv->events; event; event = next) {
> + next = event->next;
> +
> + if (event->client == client && event->id == eid) {
> + if (mask)
> + event->mask = mask;
> + else
> + FreeResource(eid, RT_NONE);
> +
> + return Success;
> + }
> + }
> +
> + if (!mask)
> + return Success;
> +
> event = calloc (1, sizeof (present_event_rec));
> if (!event)
> return BadAlloc;
> @@ -229,8 +245,10 @@ present_select_input(ClientPtr client, XID eid, WindowPtr window, CARD32 mask)
> event->next = window_priv->events;
> window_priv->events = event;
>
> - if (!AddResource(event->id, present_event_type, (void *) event))
> + if (!AddResource(event->id, present_event_type, (void *) event)) {
> + free(event);
> return BadAlloc;
> + }
>
> return Success;
> }
> diff --git a/present/present_request.c b/present/present_request.c
> index 35320b6..c7663fc 100644
> --- a/present/present_request.c
> +++ b/present/present_request.c
> @@ -184,8 +184,6 @@ proc_present_select_input (ClientPtr client)
>
> REQUEST_SIZE_MATCH(xPresentSelectInputReq);
>
> - LEGAL_NEW_RESOURCE(stuff->eid, client);
> -
> rc = dixLookupWindow(&window, stuff->window, client, DixGetAttrAccess);
> if (rc != Success)
> return rc;
>
Looks good to me, thanks for fixing this!
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.x.org/archives/xorg-devel/attachments/20160728/528ea0dd/attachment.sig>
More information about the xorg-devel
mailing list