[PATCH] Touch: Fix duplicate TouchBegin selection with virtual devices

Chase Douglas chase.douglas at ubuntu.com
Fri Sep 7 12:01:26 PDT 2012


On Fri, Sep 7, 2012 at 10:30 AM, Daniel Stone <daniel at fooishbar.org> wrote:
>
> Given the following scenario:
>   1) client A selects for TouchBegin on window W for device D
>   2) client B selects for TouchBegin on window W for XIAllDevices
>   3) client C selects for TouchBegin on window W with device E
>
> Step 3 will fail with BadImplementation, because attempting to look up
> XIAllDevices or XIAllMasterDevices with dixLookupDevices doesn't work.
> This should succeed (or, if it was selecting for device D, fail with
> BadAccess as it would be a duplicate selection).
>
> Fix this by performing the appropriate lookup for virtual devices.
>
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
> Cc: Peter Hutterer <peter.hutterer at who-t.net>
> Cc: Chase Douglas <chase.douglas at ubuntu.com>
> ---
>  Xi/xiselectev.c |    9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c
> index 0e45cb8..ab1b624 100644
> --- a/Xi/xiselectev.c
> +++ b/Xi/xiselectev.c
> @@ -180,8 +180,13 @@ ProcXISelectEvents(ClientPtr client)
>                      if (CLIENT_ID(iclient->resource) == client->index)
>                          continue;
>
> -                    dixLookupDevice(&tmp, evmask->deviceid, serverClient,
> -                                    DixReadAccess);
> +                    if (evmask->deviceid == XIAllDevices)
> +                        tmp = inputInfo.all_devices;
> +                    else if (evmask->deviceid == XIAllMasterDevices)
> +                        tmp = inputInfo.all_master_devices;
> +                    else
> +                        dixLookupDevice(&tmp, evmask->deviceid, serverClient,
> +                                        DixReadAccess);
>                      if (!tmp)
>                          return BadImplementation;       /* this shouldn't happen */
>

Looks sensible to me.

Reviewed-by: Chase Douglas <chase.douglas at ubuntu.com>

This should have a regression test in Peter's new test repo. It would
be trivial to implement.

-- Chase


More information about the xorg-devel mailing list