On Wed, Mar 07, 2018 at 10:10:41AM -0800, Jason Gerecke wrote:
> The usbChooseChannel function is responsible for finding the channel
> that should be used to contain a sequence of events for a particular
> tool/contact. If a tool/contact is already using a particular channel
> (i.e., the last event in the channel has the correct device type, serial
> number, and is in proximity) then usbChooseChannel will return that
> channel. Otherwise, usbChooseChannel will try to find a free channel
> (i.e., one which is out of proximity) to be used to store the tool's
> sequence of events.
> 
> The existing logic has a subtle bug that may result in a malfunction
> when a specific condition occurs. In particular, if a multitouch report
> from the kernel contains an existing contact going up followed by a
> brand new contact, then usbChooseChannel will see the channel associated
> with the former contact as free and begin using it to store data for the
> new contact. As a result, the "up" event is never sent and can lead to
> further strange touch behavior (including the effective disabling of
> touch input).
> 
> To fix this, we modify usbChooseChannel to consider the "valid" state as
> well as the working state when finding a new channel. A channel should
> not be considered free if its valid state is still in prox, since this
> indicates that the channel has *just* left prox. Note that we cannot
> rely on only checking the valid state since this fails in the opposite
> way: usbChooseChannel would not notice when a channel has *just* entered
> prox and would overwrite its contents.
> 
> It isn't obvious wether it is also necessary to check the valid state
> for the other two cases in this function (finding an existing channel
> and forcefully clearing channels when out of space). The existing code
> seems to work, however, so we will leave it as-is.
> 
> Ref: https://sourceforge.net/p/linuxwacom/bugs/335/?limit=25&page=1#73fe
> Ref: https://sourceforge.net/p/linuxwacom/bugs/339/#f940
> Ref: https://sourceforge.net/p/linuxwacom/bugs/349/
> Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
> ---

Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net>

Cheers,
   Peter

>  src/wcmUSB.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
> index ca63e6d..8ded958 100644
> --- a/src/wcmUSB.c
> +++ b/src/wcmUSB.c
> @@ -932,7 +932,8 @@ static int usbChooseChannel(WacomCommonPtr common, int 
> device_type, unsigned int
>                       if (i == PAD_CHANNEL)
>                               continue;
>  
> -                     if (!common->wcmChannel[i].work.proximity)
> +                     if (!common->wcmChannel[i].work.proximity &&
> +                         !common->wcmChannel[i].valid.state.proximity)
>                       {
>                               channel = i;
>                               memset(&common->wcmChannel[channel],0, 
> sizeof(WacomChannel));
> -- 
> 2.16.2
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to