Thread (5 messages) 5 messages, 3 authors, 2015-03-19

Re: HID: wacom: check for wacom->shared before following the pointer

flat view

From: Benjamin Tissoires <hidden>
Date: 2015-03-19 17:08:52

On Mar 19 2015 or thereabouts, Ping Cheng wrote:
On Thu, Mar 19, 2015 at 9:06 AM, Benjamin Tissoires
[off-list ref] wrote:
quoted
Hi Dan,

On Mar 19 2015 or thereabouts, Dan Carpenter wrote:
quoted
Hello Benjamin Tissoires,

This is a semi-automatic email about new static checker warnings.

The patch e2c7d8877e5c: "HID: wacom: check for wacom->shared before
following the pointer" from Mar 5, 2015, leads to the following
Smatch complaint:

drivers/hid/wacom_wac.c:602 wacom_intuos_inout()
       error: we previously assumed 'wacom->shared' could be null (see line 584)

drivers/hid/wacom_wac.c
   583
   584                if (wacom->shared) {

In the original code we checked "if (features->quirks & WACOM_QUIRK_MULTI_INPUT)"
which is ensures that "wacom->shared" is non-NULL.

   585                        wacom->shared->stylus_in_proximity = true;
   586
   587                        if (wacom->shared->touch_down)
   588                                return 1;
   589                }
   590
   591                /* in Range while exiting */
   592                if (((data[1] & 0xfe) == 0x20) && wacom->reporting_data) {
   593                        input_report_key(input, BTN_TOUCH, 0);
   594                        input_report_abs(input, ABS_PRESSURE, 0);
   595                        input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
   596                        return 2;
   597                }
   598
   599                /* Exit report */
   600                if ((data[1] & 0xfe) == 0x80) {
   601                        if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
We still check for that here.  Smatch is confused.

   602                                wacom->shared->stylus_in_proximity = false;
                                ^^^^^^^^^^^^^
This is not a bug, but change the previous change to
"if (wacom->shared)" would make the code more consistent.
Yep, I agree. That's for these cases that I preferred having a test
against wacom->shared not null rather than (features->quirks &
WACOM_QUIRK_MULTI_INPUT).
quoted
   603                        wacom->reporting_data = false;
   604

[ snip ]

  1072  static int wacom_24hdt_irq(struct wacom_wac *wacom)
  1073  {
  1074          struct input_dev *input = wacom->input;
  1075          unsigned char *data = wacom->data;
  1076          int i;
  1077          int current_num_contacts = data[61];
  1078          int contacts_to_send = 0;
  1079          int num_contacts_left = 4; /* maximum contacts per packet */
  1080          int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
  1081          int y_offset = 2;
  1082          static int contact_with_no_pen_down_count = 0;
  1083
  1084          if (wacom->features.type == WACOM_27QHDT) {
  1085                  current_num_contacts = data[63];
  1086                  num_contacts_left = 10;
  1087                  byte_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
  1088                  y_offset = 0;
  1089          }
  1090
  1091          /*
  1092           * First packet resets the counter since only the first
  1093           * packet in series will have non-zero current_num_contacts.
  1094           */
  1095          if (current_num_contacts) {
  1096                  wacom->num_contacts_left = current_num_contacts;
  1097                  contact_with_no_pen_down_count = 0;
  1098          }
  1099
  1100          contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
  1101
  1102          for (i = 0; i < contacts_to_send; i++) {
  1103                  int offset = (byte_per_packet * i) + 1;
  1104                  bool touch = (data[offset] & 0x1) && !wacom->shared->stylus_in_proximity;
                                                              ^^^^^^^^^^^^^
I assume this hardware is always quirky so this won't cause a NULL
deref?
Yes. 24hdt has the quirk WACOM_QUIRK_MULTI_INPUT, so wacom->shared can
not be null. I wonder what we could put in the code to make static
checkers happy...
I am working on a solution. Patches will be submitted soon.
Thanks Ping. That lower me my workload and is very appreciated.
 
Thank you Dan and Benjamin.
Thanks dan for your answer (not in this thread, but heh...)

Cheers,
Benjamin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help