HID: intel-ish-hid: Fix potential race condition
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Mon, 28 Nov 2016 19:23:35 +0000 (11:23 -0800)
committerJiri Kosina <jkosina@suse.cz>
Tue, 29 Nov 2016 14:17:34 +0000 (15:17 +0100)
Although unlikely but it is possible that when a connect or disconnect
request is issued to the firmware, before the response comes, user
terminates the client session. In this case when the response is arrived
there is no matching client instance in the list of currently active
clients. In this case, don't issue call to wake up a waiting client.

Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/intel-ish-hid/ishtp/hbm.c

index 74bffee60774f984ac1e3353e7adb4a8d5ecd4a4..59460b66e6890d06313d8098dcac152339f15b0b 100644 (file)
@@ -378,11 +378,10 @@ static void ishtp_hbm_cl_disconnect_res(struct ishtp_device *dev,
        list_for_each_entry(cl, &dev->cl_list, link) {
                if (!rs->status && ishtp_hbm_cl_addr_equal(cl, rs)) {
                        cl->state = ISHTP_CL_DISCONNECTED;
+                       wake_up_interruptible(&cl->wait_ctrl_res);
                        break;
                }
        }
-       if (cl)
-               wake_up_interruptible(&cl->wait_ctrl_res);
        spin_unlock_irqrestore(&dev->cl_list_lock, flags);
 }
 
@@ -431,11 +430,10 @@ static void ishtp_hbm_cl_connect_res(struct ishtp_device *dev,
                                cl->state = ISHTP_CL_DISCONNECTED;
                                cl->status = -ENODEV;
                        }
+                       wake_up_interruptible(&cl->wait_ctrl_res);
                        break;
                }
        }
-       if (cl)
-               wake_up_interruptible(&cl->wait_ctrl_res);
        spin_unlock_irqrestore(&dev->cl_list_lock, flags);
 }