]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Bluetooth: hidp: Fix assumptions on the return value of hidp_send_message
authorDan Elkouby <streetwalkermc@gmail.com>
Fri, 6 Sep 2019 11:06:44 +0000 (14:06 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 6 Sep 2019 13:55:40 +0000 (15:55 +0200)
hidp_send_message was changed to return non-zero values on success,
which some other bits did not expect. This caused spurious errors to be
propagated through the stack, breaking some drivers, such as hid-sony
for the Dualshock 4 in Bluetooth mode.

As pointed out by Dan Carpenter, hid-microsoft directly relied on that
assumption as well.

Fixes: 48d9cc9d85dd ("Bluetooth: hidp: Let hidp_send_message return number of queued bytes")
Signed-off-by: Dan Elkouby <streetwalkermc@gmail.com>
Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/hid/hid-microsoft.c
net/bluetooth/hidp/core.c

index 8b3a922bdad3415e8831e83901fa2fd81426f40e..2cf83856f2e41c7e6c1456224988eaaa6a370e0f 100644 (file)
@@ -303,7 +303,7 @@ static void ms_ff_worker(struct work_struct *work)
        r->magnitude[MAGNITUDE_WEAK] = ms->weak;     /* right actuator */
 
        ret = hid_hw_output_report(hdev, (__u8 *)r, sizeof(*r));
-       if (ret)
+       if (ret < 0)
                hid_warn(hdev, "failed to send FF report\n");
 }
 
index 8d889969ae7edaf2acf653098aaae0d98618776b..bef84b95e2c4704f14351570a8683b6aab688592 100644 (file)
@@ -267,7 +267,7 @@ static int hidp_get_raw_report(struct hid_device *hid,
        set_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
        data[0] = report_number;
        ret = hidp_send_ctrl_message(session, report_type, data, 1);
-       if (ret)
+       if (ret < 0)
                goto err;
 
        /* Wait for the return of the report. The returned report
@@ -343,7 +343,7 @@ static int hidp_set_raw_report(struct hid_device *hid, unsigned char reportnum,
        data[0] = reportnum;
        set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
        ret = hidp_send_ctrl_message(session, report_type, data, count);
-       if (ret)
+       if (ret < 0)
                goto err;
 
        /* Wait for the ACK from the device. */