Merge tag 'for-linus-3.12-merge' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / hid / hid-sensor-hub.c
index 1877a25524837e01839f6d3372cd45f4fce4622c..10e1581022cfdea4acd4e5431ea43155e83898f0 100644 (file)
@@ -220,7 +220,8 @@ int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
 
        mutex_lock(&data->mutex);
        report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
-       if (!report || (field_index >= report->maxfield)) {
+       if (!report || (field_index >= report->maxfield) ||
+           report->field[field_index]->report_count < 1) {
                ret = -EINVAL;
                goto done_proc;
        }
@@ -416,7 +417,7 @@ static int sensor_hub_raw_event(struct hid_device *hdev,
                return 1;
 
        ptr = raw_data;
-       ptr++; /*Skip report id*/
+       ptr++; /* Skip report id */
 
        spin_lock_irqsave(&pdata->lock, flags);
 
@@ -430,11 +431,10 @@ static int sensor_hub_raw_event(struct hid_device *hdev,
                if (pdata->pending.status && pdata->pending.attr_usage_id ==
                                report->field[i]->usage->hid) {
                        hid_dbg(hdev, "data was pending ...\n");
-                       pdata->pending.raw_data = kmalloc(sz, GFP_ATOMIC);
-                       if (pdata->pending.raw_data) {
-                               memcpy(pdata->pending.raw_data, ptr, sz);
+                       pdata->pending.raw_data = kmemdup(ptr, sz, GFP_ATOMIC);
+                       if (pdata->pending.raw_data)
                                pdata->pending.raw_size = sz;
-                       else
+                       else
                                pdata->pending.raw_size = 0;
                        complete(&pdata->pending.ready);
                }