• Jason Gerecke's avatar
    HID: wacom: Treat HID_DG_TOOLSERIALNUMBER as unsigned · 286f3f47
    Jason Gerecke authored
    Because HID_DG_TOOLSERIALNUMBER doesn't first cast the value recieved from HID
    to an unsigned type, sign-extension rules can cause the value of
    wacom_wac->serial[0] to inadvertently wind up with all 32 of its highest bits
    set if the highest bit of "value" was set.
    
    This can cause problems for Tablet PC devices which use AES sensors and the
    xf86-input-wacom userspace driver. It is not uncommon for AES sensors to send a
    serial number of '0' while the pen is entering or leaving proximity. The
    xf86-input-wacom driver ignores events with a serial number of '0' since it
    cannot match them up to an in-use tool.  To ensure the xf86-input-wacom driver
    does not ignore the final out-of-proximity event, the kernel does not send
    MSC_SERIAL events when the value of wacom_wac->serial[0] is '0'. If the highest
    bit of HID_DG_TOOLSERIALNUMBER is set by an in-prox pen which later leaves
    proximity and sends a '0' for HID_DG_TOOLSERIALNUMBER, then only the lowest 32
    bits of wacom_wac->serial[0] are actually cleared, causing the kernel to send
    an MSC_SERIAL event. Since the 'input_event' function takes an 'int' as
    argument, only those lowest (now-cleared) 32 bits of wacom_wac->serial[0] are
    sent to userspace, causing xf86-input-wacom to ignore the event. If the event
    was the final out-of-prox event, then xf86-input-wacom may remain in a state
    where it believes the pen is in proximity and refuses to allow other devices
    under its control (e.g. the touchscreen) to move the cursor.
    
    It should be noted that EMR devices and devices which use both the
    HID_DG_TOOLSERIALNUMBER and WACOM_HID_WD_SERIALHI usages (in that order) would
    be immune to this issue. It appears only AES devices are affected.
    
    Fixes: f85c9dc6 ("HID: wacom: generic: Support tool ID and additional tool types")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJason Gerecke <jason.gerecke@wacom.com>
    Acked-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    286f3f47
wacom_wac.c 137 KB