1*ffb85d5cSBenjamin Tissoires#!/bin/env python3 2*ffb85d5cSBenjamin Tissoires# SPDX-License-Identifier: GPL-2.0 3*ffb85d5cSBenjamin Tissoires# -*- coding: utf-8 -*- 4*ffb85d5cSBenjamin Tissoires# 5*ffb85d5cSBenjamin Tissoires# Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com> 6*ffb85d5cSBenjamin Tissoires# Copyright (c) 2017 Red Hat, Inc. 7*ffb85d5cSBenjamin Tissoires# 8*ffb85d5cSBenjamin Tissoires# This program is free software: you can redistribute it and/or modify 9*ffb85d5cSBenjamin Tissoires# it under the terms of the GNU General Public License as published by 10*ffb85d5cSBenjamin Tissoires# the Free Software Foundation; either version 2 of the License, or 11*ffb85d5cSBenjamin Tissoires# (at your option) any later version. 12*ffb85d5cSBenjamin Tissoires# 13*ffb85d5cSBenjamin Tissoires# This program is distributed in the hope that it will be useful, 14*ffb85d5cSBenjamin Tissoires# but WITHOUT ANY WARRANTY; without even the implied warranty of 15*ffb85d5cSBenjamin Tissoires# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*ffb85d5cSBenjamin Tissoires# GNU General Public License for more details. 17*ffb85d5cSBenjamin Tissoires# 18*ffb85d5cSBenjamin Tissoires# You should have received a copy of the GNU General Public License 19*ffb85d5cSBenjamin Tissoires# along with this program. If not, see <http://www.gnu.org/licenses/>. 20*ffb85d5cSBenjamin Tissoires# 21*ffb85d5cSBenjamin Tissoires 22*ffb85d5cSBenjamin Tissoires# This is for generic devices 23*ffb85d5cSBenjamin Tissoires 24*ffb85d5cSBenjamin Tissoiresfrom . import base 25*ffb85d5cSBenjamin Tissoiresimport logging 26*ffb85d5cSBenjamin Tissoires 27*ffb85d5cSBenjamin Tissoireslogger = logging.getLogger("hidtools.test.hid") 28*ffb85d5cSBenjamin Tissoires 29*ffb85d5cSBenjamin Tissoires 30*ffb85d5cSBenjamin Tissoiresclass TestCollectionOverflow(base.BaseTestCase.TestUhid): 31*ffb85d5cSBenjamin Tissoires """ 32*ffb85d5cSBenjamin Tissoires Test class to test re-allocation of the HID collection stack in 33*ffb85d5cSBenjamin Tissoires hid-core.c. 34*ffb85d5cSBenjamin Tissoires """ 35*ffb85d5cSBenjamin Tissoires 36*ffb85d5cSBenjamin Tissoires def create_device(self): 37*ffb85d5cSBenjamin Tissoires # fmt: off 38*ffb85d5cSBenjamin Tissoires report_descriptor = [ 39*ffb85d5cSBenjamin Tissoires 0x05, 0x01, # .Usage Page (Generic Desktop) 40*ffb85d5cSBenjamin Tissoires 0x09, 0x02, # .Usage (Mouse) 41*ffb85d5cSBenjamin Tissoires 0xa1, 0x01, # .Collection (Application) 42*ffb85d5cSBenjamin Tissoires 0x09, 0x02, # ..Usage (Mouse) 43*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ..Collection (Logical) 44*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # ...Usage (Pointer) 45*ffb85d5cSBenjamin Tissoires 0xa1, 0x00, # ...Collection (Physical) 46*ffb85d5cSBenjamin Tissoires 0x05, 0x09, # ....Usage Page (Button) 47*ffb85d5cSBenjamin Tissoires 0x19, 0x01, # ....Usage Minimum (1) 48*ffb85d5cSBenjamin Tissoires 0x29, 0x03, # ....Usage Maximum (3) 49*ffb85d5cSBenjamin Tissoires 0x15, 0x00, # ....Logical Minimum (0) 50*ffb85d5cSBenjamin Tissoires 0x25, 0x01, # ....Logical Maximum (1) 51*ffb85d5cSBenjamin Tissoires 0x75, 0x01, # ....Report Size (1) 52*ffb85d5cSBenjamin Tissoires 0x95, 0x03, # ....Report Count (3) 53*ffb85d5cSBenjamin Tissoires 0x81, 0x02, # ....Input (Data,Var,Abs) 54*ffb85d5cSBenjamin Tissoires 0x75, 0x05, # ....Report Size (5) 55*ffb85d5cSBenjamin Tissoires 0x95, 0x01, # ....Report Count (1) 56*ffb85d5cSBenjamin Tissoires 0x81, 0x03, # ....Input (Cnst,Var,Abs) 57*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 58*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 59*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 60*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 61*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 62*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 63*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 64*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 65*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 66*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 67*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 68*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 69*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 70*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 71*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 72*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 73*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 74*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 75*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 76*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 77*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 78*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 79*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 80*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 81*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 82*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 83*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 84*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 85*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 86*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 87*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 88*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 89*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ....Collection (Logical) 90*ffb85d5cSBenjamin Tissoires 0x09, 0x01, # .....Usage (Pointer) 91*ffb85d5cSBenjamin Tissoires 0x05, 0x01, # .....Usage Page (Generic Desktop) 92*ffb85d5cSBenjamin Tissoires 0x09, 0x30, # .....Usage (X) 93*ffb85d5cSBenjamin Tissoires 0x09, 0x31, # .....Usage (Y) 94*ffb85d5cSBenjamin Tissoires 0x15, 0x81, # .....Logical Minimum (-127) 95*ffb85d5cSBenjamin Tissoires 0x25, 0x7f, # .....Logical Maximum (127) 96*ffb85d5cSBenjamin Tissoires 0x75, 0x08, # .....Report Size (8) 97*ffb85d5cSBenjamin Tissoires 0x95, 0x02, # .....Report Count (2) 98*ffb85d5cSBenjamin Tissoires 0x81, 0x06, # .....Input (Data,Var,Rel) 99*ffb85d5cSBenjamin Tissoires 0xa1, 0x02, # ...Collection (Logical) 100*ffb85d5cSBenjamin Tissoires 0x85, 0x12, # ....Report ID (18) 101*ffb85d5cSBenjamin Tissoires 0x09, 0x48, # ....Usage (Resolution Multiplier) 102*ffb85d5cSBenjamin Tissoires 0x95, 0x01, # ....Report Count (1) 103*ffb85d5cSBenjamin Tissoires 0x75, 0x02, # ....Report Size (2) 104*ffb85d5cSBenjamin Tissoires 0x15, 0x00, # ....Logical Minimum (0) 105*ffb85d5cSBenjamin Tissoires 0x25, 0x01, # ....Logical Maximum (1) 106*ffb85d5cSBenjamin Tissoires 0x35, 0x01, # ....Physical Minimum (1) 107*ffb85d5cSBenjamin Tissoires 0x45, 0x0c, # ....Physical Maximum (12) 108*ffb85d5cSBenjamin Tissoires 0xb1, 0x02, # ....Feature (Data,Var,Abs) 109*ffb85d5cSBenjamin Tissoires 0x85, 0x1a, # ....Report ID (26) 110*ffb85d5cSBenjamin Tissoires 0x09, 0x38, # ....Usage (Wheel) 111*ffb85d5cSBenjamin Tissoires 0x35, 0x00, # ....Physical Minimum (0) 112*ffb85d5cSBenjamin Tissoires 0x45, 0x00, # ....Physical Maximum (0) 113*ffb85d5cSBenjamin Tissoires 0x95, 0x01, # ....Report Count (1) 114*ffb85d5cSBenjamin Tissoires 0x75, 0x10, # ....Report Size (16) 115*ffb85d5cSBenjamin Tissoires 0x16, 0x01, 0x80, # ....Logical Minimum (-32767) 116*ffb85d5cSBenjamin Tissoires 0x26, 0xff, 0x7f, # ....Logical Maximum (32767) 117*ffb85d5cSBenjamin Tissoires 0x81, 0x06, # ....Input (Data,Var,Rel) 118*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 119*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 120*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 121*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 122*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 123*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 124*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 125*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 126*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 127*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 128*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 129*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 130*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 131*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 132*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 133*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 134*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 135*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 136*ffb85d5cSBenjamin Tissoires 0xc0, # ...End Collection 137*ffb85d5cSBenjamin Tissoires 0xc0, # ..End Collection 138*ffb85d5cSBenjamin Tissoires 0xc0, # .End Collection 139*ffb85d5cSBenjamin Tissoires ] 140*ffb85d5cSBenjamin Tissoires # fmt: on 141*ffb85d5cSBenjamin Tissoires return base.UHIDTestDevice( 142*ffb85d5cSBenjamin Tissoires name=None, rdesc=report_descriptor, application="Mouse" 143*ffb85d5cSBenjamin Tissoires ) 144*ffb85d5cSBenjamin Tissoires 145*ffb85d5cSBenjamin Tissoires def test_rdesc(self): 146*ffb85d5cSBenjamin Tissoires """ 147*ffb85d5cSBenjamin Tissoires This test can only check for negatives. If the kernel crashes, you 148*ffb85d5cSBenjamin Tissoires know why. If this test passes, either the bug isn't present or just 149*ffb85d5cSBenjamin Tissoires didn't get triggered. No way to know. 150*ffb85d5cSBenjamin Tissoires 151*ffb85d5cSBenjamin Tissoires For an explanation, see kernel patch 152*ffb85d5cSBenjamin Tissoires HID: core: replace the collection tree pointers with indices 153*ffb85d5cSBenjamin Tissoires """ 154*ffb85d5cSBenjamin Tissoires pass 155