.. | .. |
---|
674 | 674 | struct input_dev *dev = psmouse->dev; |
---|
675 | 675 | struct elantech_data *etd = psmouse->private; |
---|
676 | 676 | unsigned char *packet = psmouse->packet; |
---|
677 | | - int id = ((packet[3] & 0xe0) >> 5) - 1; |
---|
| 677 | + int id; |
---|
678 | 678 | int pres, traces; |
---|
679 | 679 | |
---|
680 | | - if (id < 0) |
---|
| 680 | + id = ((packet[3] & 0xe0) >> 5) - 1; |
---|
| 681 | + if (id < 0 || id >= ETP_MAX_FINGERS) |
---|
681 | 682 | return; |
---|
682 | 683 | |
---|
683 | 684 | etd->mt[id].x = ((packet[1] & 0x0f) << 8) | packet[2]; |
---|
.. | .. |
---|
707 | 708 | int id, sid; |
---|
708 | 709 | |
---|
709 | 710 | id = ((packet[0] & 0xe0) >> 5) - 1; |
---|
710 | | - if (id < 0) |
---|
| 711 | + if (id < 0 || id >= ETP_MAX_FINGERS) |
---|
711 | 712 | return; |
---|
712 | 713 | |
---|
713 | 714 | sid = ((packet[3] & 0xe0) >> 5) - 1; |
---|
.. | .. |
---|
728 | 729 | input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[id].x); |
---|
729 | 730 | input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[id].y); |
---|
730 | 731 | |
---|
731 | | - if (sid >= 0) { |
---|
| 732 | + if (sid >= 0 && sid < ETP_MAX_FINGERS) { |
---|
732 | 733 | etd->mt[sid].x += delta_x2 * weight; |
---|
733 | 734 | etd->mt[sid].y -= delta_y2 * weight; |
---|
734 | 735 | input_mt_slot(dev, sid); |
---|